blob: e4025d9e2ff0e707336574ed623a57b5ee670e92 [file] [log] [blame]
Sebastian Redl5f0180d2010-09-10 20:55:47 +00001// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x -fms-extensions %s
2
3#define P(e) static_assert(noexcept(e), "expected nothrow")
4#define N(e) static_assert(!noexcept(e), "expected throw")
Sebastian Redldbd14bd2010-09-10 20:55:50 +00005#define B(b, e) static_assert(b == noexcept(e), "expectation failed")
Sebastian Redl5f0180d2010-09-10 20:55:47 +00006
7void simple() {
8 P(0);
9 P(0 + 0);
10 int i;
11 P(i);
12 P(sizeof(0));
13 P(static_cast<int>(0));
14 N(throw 0);
15}
16
17void nospec();
18void allspec() throw(...);
19void intspec() throw(int);
20void emptyspec() throw();
21
22void call() {
23 N(nospec());
24 N(allspec());
25 N(intspec());
26 P(emptyspec());
27}
28
29void (*pnospec)();
30void (*pallspec)() throw(...);
31void (*pintspec)() throw(int);
32void (*pemptyspec)() throw();
33
34void callptr() {
35 N(pnospec());
36 N((*pnospec)());
37 N(pallspec());
38 N((*pallspec)());
39 N(pintspec());
40 N((*pintspec)());
41 P(pemptyspec());
42 P((*pemptyspec)());
43}
44
45struct S1 {
46 void nospec();
47 void allspec() throw(...);
48 void intspec() throw(int);
49 void emptyspec() throw();
50};
51
52void callmem() {
53 S1 s;
54 N(s.nospec());
55 N(s.allspec());
56 N(s.intspec());
57 P(s.emptyspec());
58}
59
60void (S1::*mpnospec)();
61void (S1::*mpallspec)() throw(...);
62void (S1::*mpintspec)() throw(int);
63void (S1::*mpemptyspec)() throw();
64
65void callmemptr() {
66 S1 s;
67 N((s.*mpnospec)());
68 N((s.*mpallspec)());
69 N((s.*mpintspec)());
70 P((s.*mpemptyspec)());
71}
72
73struct S2 {
74 S2();
75 S2(int, int) throw();
76 void operator +();
77 void operator -() throw();
78 void operator +(int);
79 void operator -(int) throw();
80 operator int();
81 operator float() throw();
82};
83
84void *operator new(__typeof__(sizeof(int)) sz, int) throw();
85
86void implicits() {
87 N(new int);
88 P(new (0) int);
89 N(S2());
90 P(S2(0, 0));
91 S2 s;
92 N(+s);
93 P(-s);
94 N(s + 0);
95 P(s - 0);
96 N(static_cast<int>(s));
97 P(static_cast<float>(s));
98 // FIXME: test destructors of temporaries
99}
100
101struct V {
102 virtual ~V() throw();
103};
104struct D : V {};
105
106void dyncast() {
107 V *pv = 0;
108 D *pd = 0;
109 P(dynamic_cast<V&>(*pd));
110 P(dynamic_cast<V*>(pd));
111 N(dynamic_cast<D&>(*pv));
112 P(dynamic_cast<D*>(pv));
113}
114
115namespace std {
116 struct type_info {};
117}
118
119void idtype() {
120 P(typeid(V));
121 P(typeid((V*)0));
122 P(typeid(*(S1*)0));
123 N(typeid(*(V*)0));
124}
125
126void uneval() {
127 P(sizeof(typeid(*(V*)0)));
128 P(typeid(typeid(*(V*)0)));
129}
Sebastian Redldbd14bd2010-09-10 20:55:50 +0000130
131struct G1 {};
132struct G2 { int i; };
133struct G3 { S2 s; };
134
135void gencon() {
136 P(G1());
137 P(G2());
138 N(G3());
139}
140
141template <typename T, bool b>
142void late() {
143 B(b, typeid(*(T*)0));
144 B(b, T(1));
145 B(b, static_cast<T>(S2(0, 0)));
146 B(b, S1() + T());
147}
148struct S3 {
149 virtual ~S3() throw();
150 S3() throw();
151 explicit S3(int);
152 S3(const S2&);
153};
154void operator +(const S1&, float) throw();
155void operator +(const S1&, const S3&);
156void tlate() {
157 late<float, true>();
158 late<S3, false>();
159}