/* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
/* { dg-options "-ffat-lto-objects" } */
/* { dg-additional-options "-Wno-return-type" } */

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 ();
	return __dest;
    }
}
inline void clear_mem(void* ptr, u32bit n)    {
    memset(ptr, 0, n);
}
template<typename T> class MemoryRegion    {
public:
    u32bit size() const {
    }
    const T* begin() const {
    }
    void set(const T in[], u32bit n) {
	create(n);
    }
    void set(const MemoryRegion<T>& 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<typename T> void MemoryRegion<T>::create(u32bit n)    {
    if(n <= allocated) {
	clear();
    }
}
template<typename T> class SecureVector : public MemoryRegion<T>    {
public:
    SecureVector<T>& operator=(const MemoryRegion<T>& in)          {
	if(this != &in) this->set(in);
    }
};
class OctetString    {
public:
    SecureVector<byte> bits_of() const {
    }
    OctetString& operator^=(const OctetString&);
    void change(const MemoryRegion<byte>& in) {
	bits = in;
    }
    OctetString(const MemoryRegion<byte>& in) {
	change(in);
    }
    SecureVector<byte> 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());
}
