xref: /llvm-project/libcxxabi/test/unwind_06.pass.cpp (revision eb8650a75793b2bd079d0c8901ff066f129061da)
1*eb8650a7SLouis Dionne //===----------------------------------------------------------------------===//
2ac18e063SSaleem Abdulrasool //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ac18e063SSaleem Abdulrasool //
7ac18e063SSaleem Abdulrasool //===----------------------------------------------------------------------===//
8ac18e063SSaleem Abdulrasool 
98c61114cSLouis Dionne // UNSUPPORTED: no-exceptions
1057e446daSAsiri Rathnayake 
11ac18e063SSaleem Abdulrasool #include <exception>
12ac18e063SSaleem Abdulrasool #include <stdlib.h>
13ac18e063SSaleem Abdulrasool #include <assert.h>
14ac18e063SSaleem Abdulrasool #include <stdio.h>
15ac18e063SSaleem Abdulrasool 
168d313927SLouis Dionne // Suppress diagnostics about deprecated volatile operations
173a244fcfSLouis Dionne #if defined(__GNUC__) && !defined(__clang__)
188d313927SLouis Dionne # pragma GCC diagnostic ignored "-Wvolatile"
198d313927SLouis Dionne #endif
208d313927SLouis Dionne 
21ac18e063SSaleem Abdulrasool // Compile with -Os to get compiler uses float registers to hold float variables
22ac18e063SSaleem Abdulrasool 
get_(int x)23ac18e063SSaleem Abdulrasool double get_(int x) { return (double)x; }
24ac18e063SSaleem Abdulrasool 
25ac18e063SSaleem Abdulrasool double (* volatile get)(int) = get_;
26ac18e063SSaleem Abdulrasool 
27ac18e063SSaleem Abdulrasool volatile int counter;
28ac18e063SSaleem Abdulrasool 
try1(bool v)29ac18e063SSaleem Abdulrasool double try1(bool v) {
30ac18e063SSaleem Abdulrasool   double a = get(0);
31ac18e063SSaleem Abdulrasool   double b = get(1);
32a9727033SRichard Smith   for (counter = 100; counter; counter = counter - 1)
33ac18e063SSaleem Abdulrasool     a += get(1) + b;
34ac18e063SSaleem Abdulrasool   if (v) throw 10;
35ac18e063SSaleem Abdulrasool   return get(0)+a+b;
36ac18e063SSaleem Abdulrasool }
37ac18e063SSaleem Abdulrasool 
try2(bool v)38ac18e063SSaleem Abdulrasool double try2(bool v) {
39ac18e063SSaleem Abdulrasool   double a = get(0);
40ac18e063SSaleem Abdulrasool   double b = get(1);
41ac18e063SSaleem Abdulrasool   double c = get(2);
42a9727033SRichard Smith   for (counter = 100; counter; counter = counter - 1)
43ac18e063SSaleem Abdulrasool     a += get(1) + b + c;
44ac18e063SSaleem Abdulrasool   if (v) throw 10;
45ac18e063SSaleem Abdulrasool   return get(0)+a+b+c;
46ac18e063SSaleem Abdulrasool }
47ac18e063SSaleem Abdulrasool 
try3(bool v)48ac18e063SSaleem Abdulrasool double try3(bool v) {
49ac18e063SSaleem Abdulrasool   double a = get(0);
50ac18e063SSaleem Abdulrasool   double b = get(1);
51ac18e063SSaleem Abdulrasool   double c = get(2);
52ac18e063SSaleem Abdulrasool   double d = get(3);
53a9727033SRichard Smith   for (counter = 100; counter; counter = counter - 1)
54ac18e063SSaleem Abdulrasool     a += get(1) + b + c + d;
55ac18e063SSaleem Abdulrasool   if (v) throw 10;
56ac18e063SSaleem Abdulrasool   return get(0)+a+b+c+d;
57ac18e063SSaleem Abdulrasool }
58ac18e063SSaleem Abdulrasool 
try4(bool v)59ac18e063SSaleem Abdulrasool double try4(bool v) {
60ac18e063SSaleem Abdulrasool   double a = get(0);
61ac18e063SSaleem Abdulrasool   double b = get(0);
62ac18e063SSaleem Abdulrasool   double c = get(0);
63ac18e063SSaleem Abdulrasool   double d = get(0);
64ac18e063SSaleem Abdulrasool   double e = get(0);
65a9727033SRichard Smith   for (counter = 100; counter; counter = counter - 1)
66ac18e063SSaleem Abdulrasool     a += get(1) + b+c+d+e;
67ac18e063SSaleem Abdulrasool   if (v) throw 10;
68ac18e063SSaleem Abdulrasool   return get(0)+a+b+c+d+e;
69ac18e063SSaleem Abdulrasool }
70ac18e063SSaleem Abdulrasool 
try5(bool v)71ac18e063SSaleem Abdulrasool double try5(bool v) {
72ac18e063SSaleem Abdulrasool   double a = get(0);
73ac18e063SSaleem Abdulrasool   double b = get(0);
74ac18e063SSaleem Abdulrasool   double c = get(0);
75ac18e063SSaleem Abdulrasool   double d = get(0);
76ac18e063SSaleem Abdulrasool   double e = get(0);
77ac18e063SSaleem Abdulrasool   double f = get(0);
78a9727033SRichard Smith   for (counter = 100; counter; counter = counter - 1)
79ac18e063SSaleem Abdulrasool     a += get(1) + b+c+d+e+f;
80ac18e063SSaleem Abdulrasool   if (v) throw 10;
81ac18e063SSaleem Abdulrasool   return get(0)+a+b+c+d+e+f;
82ac18e063SSaleem Abdulrasool }
83ac18e063SSaleem Abdulrasool 
try6(bool v)84ac18e063SSaleem Abdulrasool double try6(bool v) {
85ac18e063SSaleem Abdulrasool   double a = get(0);
86ac18e063SSaleem Abdulrasool   double b = get(0);
87ac18e063SSaleem Abdulrasool   double c = get(0);
88ac18e063SSaleem Abdulrasool   double d = get(0);
89ac18e063SSaleem Abdulrasool   double e = get(0);
90ac18e063SSaleem Abdulrasool   double f = get(0);
91ac18e063SSaleem Abdulrasool   double g = get(0);
92a9727033SRichard Smith   for (counter = 100; counter; counter = counter - 1)
93ac18e063SSaleem Abdulrasool     a += get(1) + b+c+d+e+f+g;
94ac18e063SSaleem Abdulrasool   if (v) throw 10;
95ac18e063SSaleem Abdulrasool   return get(0)+a+b+c+d+e+f+g;
96ac18e063SSaleem Abdulrasool }
97ac18e063SSaleem Abdulrasool 
try7(bool v)98ac18e063SSaleem Abdulrasool double try7(bool v) {
99ac18e063SSaleem Abdulrasool   double a = get(0);
100ac18e063SSaleem Abdulrasool   double b = get(0);
101ac18e063SSaleem Abdulrasool   double c = get(0);
102ac18e063SSaleem Abdulrasool   double d = get(0);
103ac18e063SSaleem Abdulrasool   double e = get(0);
104ac18e063SSaleem Abdulrasool   double f = get(0);
105ac18e063SSaleem Abdulrasool   double g = get(0);
106ac18e063SSaleem Abdulrasool   double h = get(0);
107a9727033SRichard Smith   for (counter = 100; counter; counter = counter - 1)
108a140cba7SEric Fiselier     a += get(1) + b+c+d+e+f+g+h;
109ac18e063SSaleem Abdulrasool   if (v) throw 10;
110a140cba7SEric Fiselier   return get(0)+a+b+c+d+e+f+g+h;
111ac18e063SSaleem Abdulrasool }
112ac18e063SSaleem Abdulrasool 
try8(bool v)113ac18e063SSaleem Abdulrasool double try8(bool v) {
114ac18e063SSaleem Abdulrasool   double a = get(0);
115ac18e063SSaleem Abdulrasool   double b = get(0);
116ac18e063SSaleem Abdulrasool   double c = get(0);
117ac18e063SSaleem Abdulrasool   double d = get(0);
118ac18e063SSaleem Abdulrasool   double e = get(0);
119ac18e063SSaleem Abdulrasool   double f = get(0);
120ac18e063SSaleem Abdulrasool   double g = get(0);
121ac18e063SSaleem Abdulrasool   double h = get(0);
122ac18e063SSaleem Abdulrasool   double i = get(0);
123a9727033SRichard Smith   for (counter = 100; counter; counter = counter - 1)
124a140cba7SEric Fiselier     a += get(1) + b+c+d+e+f+g+h+i;
125ac18e063SSaleem Abdulrasool   if (v) throw 10;
126a140cba7SEric Fiselier   return get(0)+a+b+c+d+e+f+g+h+i;
127ac18e063SSaleem Abdulrasool }
128ac18e063SSaleem Abdulrasool 
129ac18e063SSaleem Abdulrasool 
130ac18e063SSaleem Abdulrasool 
131ac18e063SSaleem Abdulrasool 
132ac18e063SSaleem Abdulrasool 
foo()133ac18e063SSaleem Abdulrasool double foo()
134ac18e063SSaleem Abdulrasool {
135ac18e063SSaleem Abdulrasool   double a = get(1);
136ac18e063SSaleem Abdulrasool   double b = get(2);
137ac18e063SSaleem Abdulrasool   double c = get(3);
138ac18e063SSaleem Abdulrasool   double d = get(4);
139ac18e063SSaleem Abdulrasool   double e = get(5);
140ac18e063SSaleem Abdulrasool   double f = get(6);
141ac18e063SSaleem Abdulrasool   double g = get(7);
142ac18e063SSaleem Abdulrasool   double h = get(8);
143ac18e063SSaleem Abdulrasool   try {
144ac18e063SSaleem Abdulrasool     try1(true);
145ac18e063SSaleem Abdulrasool   }
1468d313927SLouis Dionne   catch (int) {
147ac18e063SSaleem Abdulrasool   }
148ac18e063SSaleem Abdulrasool   assert(a == get(1));
149ac18e063SSaleem Abdulrasool   assert(b == get(2));
150ac18e063SSaleem Abdulrasool   assert(c == get(3));
151ac18e063SSaleem Abdulrasool   assert(d == get(4));
152ac18e063SSaleem Abdulrasool   assert(e == get(5));
153ac18e063SSaleem Abdulrasool   assert(f == get(6));
154ac18e063SSaleem Abdulrasool   assert(g == get(7));
155ac18e063SSaleem Abdulrasool   assert(h == get(8));
156ac18e063SSaleem Abdulrasool 
157ac18e063SSaleem Abdulrasool   try {
158ac18e063SSaleem Abdulrasool     try2(true);
159ac18e063SSaleem Abdulrasool   }
1608d313927SLouis Dionne   catch (int) {
161ac18e063SSaleem Abdulrasool   }
162ac18e063SSaleem Abdulrasool   assert(a == get(1));
163ac18e063SSaleem Abdulrasool   assert(b == get(2));
164ac18e063SSaleem Abdulrasool   assert(c == get(3));
165ac18e063SSaleem Abdulrasool   assert(d == get(4));
166ac18e063SSaleem Abdulrasool   assert(e == get(5));
167ac18e063SSaleem Abdulrasool   assert(f == get(6));
168ac18e063SSaleem Abdulrasool   assert(g == get(7));
169ac18e063SSaleem Abdulrasool   assert(h == get(8));
170ac18e063SSaleem Abdulrasool 
171ac18e063SSaleem Abdulrasool   try {
172ac18e063SSaleem Abdulrasool     try3(true);
173ac18e063SSaleem Abdulrasool   }
1748d313927SLouis Dionne   catch (int) {
175ac18e063SSaleem Abdulrasool   }
176ac18e063SSaleem Abdulrasool   assert(a == get(1));
177ac18e063SSaleem Abdulrasool   assert(b == get(2));
178ac18e063SSaleem Abdulrasool   assert(c == get(3));
179ac18e063SSaleem Abdulrasool   assert(d == get(4));
180ac18e063SSaleem Abdulrasool   assert(e == get(5));
181ac18e063SSaleem Abdulrasool   assert(f == get(6));
182ac18e063SSaleem Abdulrasool   assert(g == get(7));
183ac18e063SSaleem Abdulrasool   assert(h == get(8));
184ac18e063SSaleem Abdulrasool 
185ac18e063SSaleem Abdulrasool   try {
186ac18e063SSaleem Abdulrasool     try4(true);
187ac18e063SSaleem Abdulrasool   }
1888d313927SLouis Dionne   catch (int) {
189ac18e063SSaleem Abdulrasool   }
190ac18e063SSaleem Abdulrasool   assert(a == get(1));
191ac18e063SSaleem Abdulrasool   assert(b == get(2));
192ac18e063SSaleem Abdulrasool   assert(c == get(3));
193ac18e063SSaleem Abdulrasool   assert(d == get(4));
194ac18e063SSaleem Abdulrasool   assert(e == get(5));
195ac18e063SSaleem Abdulrasool   assert(f == get(6));
196ac18e063SSaleem Abdulrasool   assert(g == get(7));
197ac18e063SSaleem Abdulrasool   assert(h == get(8));
198ac18e063SSaleem Abdulrasool 
199ac18e063SSaleem Abdulrasool   try {
200ac18e063SSaleem Abdulrasool     try5(true);
201ac18e063SSaleem Abdulrasool   }
2028d313927SLouis Dionne   catch (int) {
203ac18e063SSaleem Abdulrasool   }
204ac18e063SSaleem Abdulrasool   assert(a == get(1));
205ac18e063SSaleem Abdulrasool   assert(b == get(2));
206ac18e063SSaleem Abdulrasool   assert(c == get(3));
207ac18e063SSaleem Abdulrasool   assert(d == get(4));
208ac18e063SSaleem Abdulrasool   assert(e == get(5));
209ac18e063SSaleem Abdulrasool   assert(f == get(6));
210ac18e063SSaleem Abdulrasool   assert(g == get(7));
211ac18e063SSaleem Abdulrasool   assert(h == get(8));
212ac18e063SSaleem Abdulrasool 
213ac18e063SSaleem Abdulrasool   try {
214ac18e063SSaleem Abdulrasool     try6(true);
215ac18e063SSaleem Abdulrasool   }
2168d313927SLouis Dionne   catch (int) {
217ac18e063SSaleem Abdulrasool   }
218ac18e063SSaleem Abdulrasool   assert(a == get(1));
219ac18e063SSaleem Abdulrasool   assert(b == get(2));
220ac18e063SSaleem Abdulrasool   assert(c == get(3));
221ac18e063SSaleem Abdulrasool   assert(d == get(4));
222ac18e063SSaleem Abdulrasool   assert(e == get(5));
223ac18e063SSaleem Abdulrasool   assert(f == get(6));
224ac18e063SSaleem Abdulrasool   assert(g == get(7));
225ac18e063SSaleem Abdulrasool   assert(h == get(8));
226ac18e063SSaleem Abdulrasool 
227ac18e063SSaleem Abdulrasool   try {
228ac18e063SSaleem Abdulrasool     try7(true);
229ac18e063SSaleem Abdulrasool   }
2308d313927SLouis Dionne   catch (int) {
231ac18e063SSaleem Abdulrasool   }
232ac18e063SSaleem Abdulrasool   assert(a == get(1));
233ac18e063SSaleem Abdulrasool   assert(b == get(2));
234ac18e063SSaleem Abdulrasool   assert(c == get(3));
235ac18e063SSaleem Abdulrasool   assert(d == get(4));
236ac18e063SSaleem Abdulrasool   assert(e == get(5));
237ac18e063SSaleem Abdulrasool   assert(f == get(6));
238ac18e063SSaleem Abdulrasool   assert(g == get(7));
239ac18e063SSaleem Abdulrasool   assert(h == get(8));
240ac18e063SSaleem Abdulrasool 
241ac18e063SSaleem Abdulrasool   try {
242ac18e063SSaleem Abdulrasool     try8(true);
243ac18e063SSaleem Abdulrasool   }
2448d313927SLouis Dionne   catch (int) {
245ac18e063SSaleem Abdulrasool   }
246ac18e063SSaleem Abdulrasool   assert(a == get(1));
247ac18e063SSaleem Abdulrasool   assert(b == get(2));
248ac18e063SSaleem Abdulrasool   assert(c == get(3));
249ac18e063SSaleem Abdulrasool   assert(d == get(4));
250ac18e063SSaleem Abdulrasool   assert(e == get(5));
251ac18e063SSaleem Abdulrasool   assert(f == get(6));
252ac18e063SSaleem Abdulrasool   assert(g == get(7));
253ac18e063SSaleem Abdulrasool   assert(h == get(8));
254ac18e063SSaleem Abdulrasool 
255ac18e063SSaleem Abdulrasool   return a+b+c+d+e+f+g+h;
256ac18e063SSaleem Abdulrasool }
257ac18e063SSaleem Abdulrasool 
258ac18e063SSaleem Abdulrasool 
259ac18e063SSaleem Abdulrasool 
main(int,char **)260504bc07dSLouis Dionne int main(int, char**) {
261ac18e063SSaleem Abdulrasool   foo();
262504bc07dSLouis Dionne   return 0;
263ac18e063SSaleem Abdulrasool }
264