Be careful about comdat boundary in ICF (PR ipa/82352).
[official-gcc.git] / gcc / testsuite / g++.dg / opt / pr23478.C
blobda1371d25149708639ff511d48d7d23c1a85ad38
1 // PR rtl-optimization/23478
2 // { dg-do run }
3 // { dg-options "-O2" }
5 extern "C" void abort ();
6 bool tthrow;
7 struct C3 { int i; };
8 class C14 {};
9 struct C7
11   virtual ~C7 ();
14 C7::~C7 ()
16   asm volatile ("" : : : "memory");
18 class C2 : public C7 {};
20 template <class X> class C13
22   bool ma;
23   X *mb;
24 public:
25   explicit C13 (X *p = 0) throw () : ma (p != 0), mb (p) {}
26   ~C13 ();
29 template <class X>
30 C13<X>::~C13 ()
32   asm volatile ("" : : "r" (ma), "r" (mb) : "memory");
35 struct C1
37   C1 (const C3 &, const C3 &, const C3 &, const C3 *&);
40 C1::C1 (const C3 &, const C3 &, const C3 &, const C3 *&)
42   if (!tthrow)
43     throw 24;
46 struct C8
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 () {}
55 bool
56 xx14 ()
58   bool b = false;
59   if (tthrow)
60     throw 6;
61   asm volatile ("" : : "r" (&b) : "memory");
62   return b;
65 bool
66 xx2 ()
68   bool b = false;
69   if (tthrow)
70     throw 6;
71   asm volatile ("" : : "r" (&b) : "memory");
72   return b;
75 C13<C7>
76 xx9 ()
78   return C13<C7>();
81 C2 &
82 xx10 ()
84   static C2 c2;
85   return c2;
88 C3 &
89 xx12 ()
91   static C3 c3 = { 1 };
92   return c3;
95 const C3 &
96 xx5 ()
98   static const C3 c3 = { 2 };
99   return c3;
102 const C3 *&
103 xx4 ()
105   static const C3 *p;
106   if (tthrow)
107     throw 6;
108   return p;
111 long ll13;
113 long
114 xx13 ()
116   long ret;
117   asm volatile ("" : "=r" (ret) : "r" (ll13));
118   return ret;
121 void
122 xx15 (C3 &x, C13<C1> &y)
124   asm volatile ("" : : "r" (&x), "r" (&y) : "memory");
127 long
128 xx16 (const void *x)
130   long ret;
131   asm volatile ("" : "=r" (ret) : "0" (1), "r" (x) : "memory");
132   return ret;
135 void
136 xx1 (C13<C14> x)
138   asm volatile ("" : : "r" (&x) : "memory");
139   if (tthrow)
140     throw 6;
143 void
144 xx3 (const C7 *x)
146   if (x)
147     abort ();
150 void
151 xx7 ()
153   asm volatile ("" : : : "memory");
156 struct C5
158   C13<C7> f2 (C3 &v1, const void *v2, C8 *v6);
159   C7 *m2[2];
160   long m1[2];
163 C13<C7>
164 C5::f2 (C3 &v1, const void *v2, C8 *v6)
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;
195 main (void)
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 ();