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

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());
}
