pr23478.C revision 1.1.1.1
1// PR rtl-optimization/23478 2// { dg-do run } 3// { dg-options "-O2" } 4 5extern "C" void abort (); 6bool tthrow; 7struct C3 { int i; }; 8class C14 {}; 9struct C7 10{ 11 virtual ~C7 (); 12}; 13 14C7::~C7 () 15{ 16 asm volatile ("" : : : "memory"); 17} 18class C2 : public C7 {}; 19 20template <class X> class C13 21{ 22 bool ma; 23 X *mb; 24public: 25 explicit C13 (X *p = 0) throw () : ma (p != 0), mb (p) {} 26 ~C13 (); 27}; 28 29template <class X> 30C13<X>::~C13 () 31{ 32 asm volatile ("" : : "r" (ma), "r" (mb) : "memory"); 33} 34 35struct C1 36{ 37 C1 (const C3 &, const C3 &, const C3 &, const C3 *&); 38}; 39 40C1::C1 (const C3 &, const C3 &, const C3 &, const C3 *&) 41{ 42 if (!tthrow) 43 throw 24; 44} 45 46struct C8 47{ 48 struct C15 {}; 49 typedef C15 *C9; 50 virtual void f1 (C2 &, long *, void *, C3 &, void *, bool) = 0; 51 virtual C13<C14> f3 () const = 0; 52 virtual ~C8 () {} 53}; 54 55bool 56xx14 () 57{ 58 bool b = false; 59 if (tthrow) 60 throw 6; 61 asm volatile ("" : : "r" (&b) : "memory"); 62 return b; 63} 64 65bool 66xx2 () 67{ 68 bool b = false; 69 if (tthrow) 70 throw 6; 71 asm volatile ("" : : "r" (&b) : "memory"); 72 return b; 73} 74 75C13<C7> 76xx9 () 77{ 78 return C13<C7>(); 79} 80 81C2 & 82xx10 () 83{ 84 static C2 c2; 85 return c2; 86} 87 88C3 & 89xx12 () 90{ 91 static C3 c3 = { 1 }; 92 return c3; 93} 94 95const C3 & 96xx5 () 97{ 98 static const C3 c3 = { 2 }; 99 return c3; 100} 101 102const C3 *& 103xx4 () 104{ 105 static const C3 *p; 106 if (tthrow) 107 throw 6; 108 return p; 109} 110 111long ll13; 112 113long 114xx13 () 115{ 116 long ret; 117 asm volatile ("" : "=r" (ret) : "r" (ll13)); 118 return ret; 119} 120 121void 122xx15 (C3 &x, C13<C1> &y) 123{ 124 asm volatile ("" : : "r" (&x), "r" (&y) : "memory"); 125} 126 127long 128xx16 (const void *x) 129{ 130 long ret; 131 asm volatile ("" : "=r" (ret) : "0" (1), "r" (x) : "memory"); 132 return ret; 133} 134 135void 136xx1 (C13<C14> x) 137{ 138 asm volatile ("" : : "r" (&x) : "memory"); 139 if (tthrow) 140 throw 6; 141} 142 143void 144xx3 (const C7 *x) 145{ 146 if (x) 147 abort (); 148} 149 150void 151xx7 () 152{ 153 asm volatile ("" : : : "memory"); 154} 155 156struct C5 157{ 158 C13<C7> f2 (C3 &v1, const void *v2, C8 *v6); 159 C7 *m2[2]; 160 long m1[2]; 161}; 162 163C13<C7> 164C5::f2 (C3 &v1, const void *v2, C8 *v6) 165{ 166 C13<C7> v13 = xx9 (); 167 C2 &v9 = xx10 (); 168 for (long i = 1; i < 2; i++) 169 xx3 (m2[i]); 170 const C3 &ld = xx5 (); 171 xx7 (); 172 if (xx2 ()) 173 throw ""; 174 xx4 (); 175 C3 &si = xx12 (); 176 for (long i = 0; i < xx16 (v2); ++i) 177 { 178 C13<C1> sk (new C1 (xx5 (), ld, xx5 (), xx4 ())); 179 xx15 (si, sk); 180 } 181 long v4 = xx13 (); 182 for (long i = v4 - 1; i >= 0; --i) 183 m1[i] = i; 184 bool v8 = xx2 (); 185 for (long i = 0; i < 2 && !xx14 (); i++) 186 { 187 v6[i].f1 (v9, 0, __null, v1, __null, v8); 188 if (v8) 189 xx1 (v6[i].f3 ()); 190 } 191 return v13; 192} 193 194int 195main (void) 196{ 197 C5 c5 = { { __null, __null }, { 0, 0 } }; 198 bool seen = false; 199 try 200 { 201 c5.f2 (xx12 (), __null, __null); 202 } 203 catch (int n) 204 { 205 if (n != 24) 206 abort (); 207 seen = true; 208 } 209 if (!seen) 210 abort (); 211} 212