1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 -fms-extensions -Wno-delete-incomplete %s
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov// expected-no-diagnostics
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define P(e) static_assert(noexcept(e), "expected nothrow")
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define N(e) static_assert(!noexcept(e), "expected throw")
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define B(b, e) static_assert(b == noexcept(e), "expectation failed")
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid simple() {
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(0);
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(0 + 0);
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  int i;
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(i);
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(sizeof(0));
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(static_cast<int>(0));
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(throw 0);
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N((throw 0, 0));
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid nospec();
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid allspec() throw(...);
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid intspec() throw(int);
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid emptyspec() throw();
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid nothrowattr() __attribute__((nothrow));
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid noexcept_true() noexcept;
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid noexcept_false() noexcept(false);
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid call() {
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(nospec());
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(allspec());
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(intspec());
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(emptyspec());
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(nothrowattr());
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(noexcept_true());
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(noexcept_false());
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid (*pnospec)();
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid (*pallspec)() throw(...);
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid (*pintspec)() throw(int);
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid (*pemptyspec)() throw();
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef void (*funcptr)();
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovfuncptr returnsptr() throw();
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid callptr() {
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(pnospec());
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N((*pnospec)());
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(pallspec());
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N((*pallspec)());
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(pintspec());
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N((*pintspec)());
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(pemptyspec());
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P((*pemptyspec)());
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(returnsptr()());
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct S1 {
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  void nospec();
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  void allspec() throw(...);
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  void intspec() throw(int);
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  void emptyspec() throw();
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid callmem() {
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  S1 s;
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(s.nospec());
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(s.allspec());
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(s.intspec());
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(s.emptyspec());
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid (S1::*mpnospec)();
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid (S1::*mpallspec)() throw(...);
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid (S1::*mpintspec)() throw(int);
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid (S1::*mpemptyspec)() throw();
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid callmemptr() {
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  S1 s;
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N((s.*mpnospec)());
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N((s.*mpallspec)());
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N((s.*mpintspec)());
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P((s.*mpemptyspec)());
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct S2 {
86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  S2();
87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  S2(int, int) throw();
88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  void operator +();
89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  void operator -() throw();
90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  void operator +(int);
91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  void operator -(int) throw();
92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  operator int();
93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  operator float() throw();
94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid *operator new(__typeof__(sizeof(int)) sz, int) throw();
97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct IncompleteStruct;
99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct Bad1 {
101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  ~Bad1() throw(int);
102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct Bad2 {
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  void operator delete(void*) throw(int);
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtypedef int X;
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid implicits() {
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(new int);
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(new (0) int);
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(delete (int*)0);
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(delete (IncompleteStruct*)0);
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(delete (Bad1*)0);
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(delete (Bad2*)0);
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(S2());
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(S2(0, 0));
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  S2 s;
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(+s);
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(-s);
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(s + 0);
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(s - 0);
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(static_cast<int>(s));
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(static_cast<float>(s));
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(Bad1());
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(X().~X());
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct V {
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  virtual ~V() throw();
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct D : V {};
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid dyncast() {
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  V *pv = 0;
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  D *pd = 0;
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(dynamic_cast<V&>(*pd));
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(dynamic_cast<V*>(pd));
139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(dynamic_cast<D&>(*pv));
140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(dynamic_cast<D*>(pv));
141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovnamespace std {
144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  struct type_info {};
145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid idtype() {
148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(typeid(V));
149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(typeid((V*)0));
150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(typeid(*(S1*)0));
151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(typeid(*(V*)0));
152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid uneval() {
155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(sizeof(typeid(*(V*)0)));
156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(typeid(typeid(*(V*)0)));
157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct G1 {};
160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct G2 { int i; };
161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct G3 { S2 s; };
162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid gencon() {
164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(G1());
165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(G2());
166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  N(G3());
167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtemplate <class T> void f(T&&) noexcept;
170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtemplate <typename T, bool b>
171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid late() {
172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  B(b, typeid(*(T*)0));
173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  B(b, T(1));
174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  B(b, static_cast<T>(S2(0, 0)));
175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  B(b, S1() + T());
176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(f(T()));
177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(new (0) T);
178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(delete (T*)0);
179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstruct S3 {
181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  virtual ~S3() throw();
182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  S3() throw();
183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  explicit S3(int);
184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  S3(const S2&);
185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov};
186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtemplate <class T> T&& f2() noexcept;
187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovtemplate <typename T>
188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid late2() {
189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  P(dynamic_cast<S3&>(f2<T&>()));
190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid operator +(const S1&, float) throw();
192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid operator +(const S1&, const S3&);
193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid tlate() {
194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  late<float, true>();
195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  late<S3, false>();
196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  late2<S3>();
197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov