/* { dg-do compile } */ /* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ /* { dg-options "-ffat-lto-objects" } */ typedef unsigned char uint8_t; typedef unsigned int uint32_t; typedef uint8_t byte; typedef uint32_t u32bit; __extension__ typedef __SIZE_TYPE__ size_t; extern "C" { extern void __warn_memset_zero_len (void) __attribute__((__warning__ (""))); extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__, __artificial__)) void * memset (void *__dest, int __ch, size_t __len) throw () { if (__builtin_constant_p (__len) && __len == 0) __warn_memset_zero_len (); /* { dg-warning "declared with attribute warning" } */ } } inline void clear_mem(void* ptr, u32bit n) { memset(ptr, 0, n); } template class MemoryRegion { public: u32bit size() const { } const T* begin() const { } void set(const T in[], u32bit n) { create(n); } void set(const MemoryRegion& in) { set(in.begin(), in.size()); } void clear() { clear_mem(buf, allocated); } void create(u32bit); MemoryRegion() { used = allocated = 0; } mutable T* buf; mutable u32bit used; mutable u32bit allocated; }; template void MemoryRegion::create(u32bit n) { if(n <= allocated) { clear(); } } template class SecureVector : public MemoryRegion { public: SecureVector& operator=(const MemoryRegion& in) { if(this != &in) this->set(in); } }; class OctetString { public: SecureVector bits_of() const { } OctetString& operator^=(const OctetString&); void change(const MemoryRegion& in) { bits = in; } OctetString(const MemoryRegion& in) { change(in); } SecureVector bits; }; OctetString& OctetString::operator^=(const OctetString& k) { if(&k == this) { bits.clear(); } } bool __attribute__((flatten)) operator==(const OctetString& s1, const OctetString& s2) { return (s1.bits_of() == s2.bits_of()); }