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