1 // PR c++/7050
2 // { dg-do run }
3 
4 extern "C" void abort(void);
5 
6 #define CI(stmt) try { stmt; abort(); } catch (int) { }
7 
8 struct has_destructor
9 {
~has_destructorhas_destructor10     ~has_destructor() { }
11 };
12 
13 struct no_destructor
14 {
15 };
16 
PI(int & i)17 int PI(int& i) { return i++; }
18 
main(int argc,char * argv[])19 int main(int argc, char *argv[])
20 {
21     (argc+1 ? has_destructor() : throw 0);
22     CI((argc+1 ? throw 0 : has_destructor()));
23     CI((0 ? has_destructor() : throw 0));
24     CI((1 ? throw 0 : has_destructor()));
25     (0 ? throw 0 : has_destructor());
26     (1 ? has_destructor() : throw 0);
27 
28     (argc+1 ? no_destructor() : throw 0);
29     CI((argc+1 ? throw 0 : no_destructor()));
30     CI((0 ? no_destructor() : throw 0));
31     CI((1 ? throw 0 : no_destructor()));
32     (0 ? throw 0 : no_destructor());
33     (1 ? no_destructor() : throw 0);
34 
35     int i = 1;
36     CI(throw PI(i));
37     if (i != 2) abort();
38 
39     (1 ? 0 : throw PI(i));
40     if (i != 2) abort();
41 
42     CI(0 ? 0 : throw PI(i));
43     if (i != 3) abort();
44 
45     CI(0 ? has_destructor() : throw PI(i));
46     if (i != 4) abort();
47     (argc+1 ? has_destructor() : throw PI(i));
48     if (i != 4) abort();
49 
50     i = 1;
51     CI(throw i++);
52     if (i != 2) abort();
53 
54     (1 ? 0 : throw i++);
55     if (i != 2) abort();
56 
57     CI(0 ? 0 : throw i++);
58     if (i != 3) abort();
59 
60     CI(0 ? has_destructor() : throw i++);
61     if (i != 4) abort();
62     (argc+1 ? has_destructor() : throw i++);
63     if (i != 4) abort();
64 }
65