sema.cpp revision abea951c34876a5374d0e3678c7989b225c5c895
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++0x -fms-extensions %s
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define P(e) static_assert(noexcept(e), "expected nothrow")
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define N(e) static_assert(!noexcept(e), "expected throw")
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define B(b, e) static_assert(b == noexcept(e), "expectation failed")
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void simple() {
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  P(0);
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  P(0 + 0);
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int i;
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  P(i);
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  P(sizeof(0));
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  P(static_cast<int>(0));
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  N(throw 0);
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  N((throw 0, 0));
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void nospec();
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void allspec() throw(...);
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void intspec() throw(int);
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid emptyspec() throw();
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void nothrowattr() __attribute__((nothrow));
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void call() {
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  N(nospec());
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  N(allspec());
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  N(intspec());
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  P(emptyspec());
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  P(nothrowattr());
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void (*pnospec)();
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void (*pallspec)() throw(...);
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void (*pintspec)() throw(int);
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void (*pemptyspec)() throw();
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void callptr() {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  N(pnospec());
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  N((*pnospec)());
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  N(pallspec());
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  N((*pallspec)());
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  N(pintspec());
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  N((*pintspec)());
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  P(pemptyspec());
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  P((*pemptyspec)());
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct S1 {
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void nospec();
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void allspec() throw(...);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void intspec() throw(int);
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void emptyspec() throw();
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55void callmem() {
56  S1 s;
57  N(s.nospec());
58  N(s.allspec());
59  N(s.intspec());
60  P(s.emptyspec());
61}
62
63void (S1::*mpnospec)();
64void (S1::*mpallspec)() throw(...);
65void (S1::*mpintspec)() throw(int);
66void (S1::*mpemptyspec)() throw();
67
68void callmemptr() {
69  S1 s;
70  N((s.*mpnospec)());
71  N((s.*mpallspec)());
72  N((s.*mpintspec)());
73  P((s.*mpemptyspec)());
74}
75
76struct S2 {
77  S2();
78  S2(int, int) throw();
79  void operator +();
80  void operator -() throw();
81  void operator +(int);
82  void operator -(int) throw();
83  operator int();
84  operator float() throw();
85};
86
87void *operator new(__typeof__(sizeof(int)) sz, int) throw();
88
89struct Bad1 {
90  ~Bad1() throw(int);
91};
92struct Bad2 {
93  void operator delete(void*) throw(int);
94};
95
96void implicits() {
97  N(new int);
98  P(new (0) int);
99  P(delete (int*)0);
100  N(delete (Bad1*)0);
101  N(delete (Bad2*)0);
102  N(S2());
103  P(S2(0, 0));
104  S2 s;
105  N(+s);
106  P(-s);
107  N(s + 0);
108  P(s - 0);
109  N(static_cast<int>(s));
110  P(static_cast<float>(s));
111  N(Bad1());
112}
113
114struct V {
115  virtual ~V() throw();
116};
117struct D : V {};
118
119void dyncast() {
120  V *pv = 0;
121  D *pd = 0;
122  P(dynamic_cast<V&>(*pd));
123  P(dynamic_cast<V*>(pd));
124  N(dynamic_cast<D&>(*pv));
125  P(dynamic_cast<D*>(pv));
126}
127
128namespace std {
129  struct type_info {};
130}
131
132void idtype() {
133  P(typeid(V));
134  P(typeid((V*)0));
135  P(typeid(*(S1*)0));
136  N(typeid(*(V*)0));
137}
138
139void uneval() {
140  P(sizeof(typeid(*(V*)0)));
141  P(typeid(typeid(*(V*)0)));
142}
143
144struct G1 {};
145struct G2 { int i; };
146struct G3 { S2 s; };
147
148void gencon() {
149  P(G1());
150  P(G2());
151  N(G3());
152}
153
154template <typename T, bool b>
155void late() {
156  B(b, typeid(*(T*)0));
157  B(b, T(1));
158  B(b, static_cast<T>(S2(0, 0)));
159  B(b, S1() + T());
160}
161struct S3 {
162  virtual ~S3() throw();
163  S3() throw();
164  explicit S3(int);
165  S3(const S2&);
166};
167void operator +(const S1&, float) throw();
168void operator +(const S1&, const S3&);
169void tlate() {
170  late<float, true>();
171  late<S3, false>();
172}
173