1/* { dg-do compile } */
2/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
3/* { dg-options "-ffat-lto-objects" } */
4
5typedef unsigned char uint8_t;
6typedef unsigned int uint32_t;
7typedef uint8_t byte;
8typedef uint32_t u32bit;
9__extension__ typedef __SIZE_TYPE__ size_t;
10extern "C" {
11    extern void __warn_memset_zero_len (void) __attribute__((__warning__ ("")));
12    extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__, __artificial__))
13    void * memset (void *__dest, int __ch, size_t __len) throw () {
14	if (__builtin_constant_p (__len) && __len == 0)
15	    __warn_memset_zero_len (); /* { dg-warning "declared with attribute warning" } */
16    }
17}
18inline void clear_mem(void* ptr, u32bit n)    {
19    memset(ptr, 0, n);
20}
21template<typename T> class MemoryRegion    {
22public:
23    u32bit size() const {
24    }
25    const T* begin() const {
26    }
27    void set(const T in[], u32bit n) {
28	create(n);
29    }
30    void set(const MemoryRegion<T>& in) {
31	set(in.begin(), in.size());
32    }
33    void clear() {
34	clear_mem(buf, allocated);
35    }
36    void create(u32bit);
37    MemoryRegion() {
38	used = allocated = 0;
39    }
40    mutable T* buf;
41    mutable u32bit used;
42    mutable u32bit allocated;
43};
44template<typename T> void MemoryRegion<T>::create(u32bit n)    {
45    if(n <= allocated) {
46	clear();
47    }
48}
49template<typename T> class SecureVector : public MemoryRegion<T>    {
50public:
51    SecureVector<T>& operator=(const MemoryRegion<T>& in)          {
52	if(this != &in) this->set(in);
53    }
54};
55class OctetString    {
56public:
57    SecureVector<byte> bits_of() const {
58    }
59    OctetString& operator^=(const OctetString&);
60    void change(const MemoryRegion<byte>& in) {
61	bits = in;
62    }
63    OctetString(const MemoryRegion<byte>& in) {
64	change(in);
65    }
66    SecureVector<byte> bits;
67};
68OctetString& OctetString::operator^=(const OctetString& k)    {
69    if(&k == this) {
70	bits.clear();
71    }
72}
73bool __attribute__((flatten))
74operator==(const OctetString& s1, const OctetString& s2)    {
75    return (s1.bits_of() == s2.bits_of());
76}
77