10e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 -fms-extensions -Wno-delete-incomplete -Wno-unused-value %s
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
3295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
4295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl#define P(e) static_assert(noexcept(e), "expected nothrow")
5295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl#define N(e) static_assert(!noexcept(e), "expected throw")
62a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl#define B(b, e) static_assert(b == noexcept(e), "expectation failed")
7295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
8295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid simple() {
9295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(0);
10295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(0 + 0);
11295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  int i;
12295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(i);
13295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(sizeof(0));
14295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(static_cast<int>(0));
15295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(throw 0);
16c574959e7bb9b0fae6fcf07deb6f2ba3f15ec3b1Sebastian Redl  N((throw 0, 0));
17295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
18295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
19295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid nospec();
20295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid allspec() throw(...);
21295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid intspec() throw(int);
22295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid emptyspec() throw();
235221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redlvoid nothrowattr() __attribute__((nothrow));
240eab51c38db24f445ee6d84486169e3e02888489Sebastian Redlvoid noexcept_true() noexcept;
250eab51c38db24f445ee6d84486169e3e02888489Sebastian Redlvoid noexcept_false() noexcept(false);
26295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
27295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid call() {
28295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(nospec());
29295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(allspec());
30295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(intspec());
31295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(emptyspec());
325221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  P(nothrowattr());
330eab51c38db24f445ee6d84486169e3e02888489Sebastian Redl  P(noexcept_true());
340eab51c38db24f445ee6d84486169e3e02888489Sebastian Redl  N(noexcept_false());
35295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
36295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
37295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid (*pnospec)();
38295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid (*pallspec)() throw(...);
39295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid (*pintspec)() throw(int);
40295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid (*pemptyspec)() throw();
41295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
42f9b4fea4bf6cebe614e49ab4b582dcf4bf0a6806Eli Friedmantypedef void (*funcptr)();
43f9b4fea4bf6cebe614e49ab4b582dcf4bf0a6806Eli Friedmanfuncptr returnsptr() throw();
44f9b4fea4bf6cebe614e49ab4b582dcf4bf0a6806Eli Friedman
45295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid callptr() {
46295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(pnospec());
47295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N((*pnospec)());
48295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(pallspec());
49295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N((*pallspec)());
50295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(pintspec());
51295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N((*pintspec)());
52295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(pemptyspec());
53295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P((*pemptyspec)());
54f9b4fea4bf6cebe614e49ab4b582dcf4bf0a6806Eli Friedman  N(returnsptr()());
55295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
56295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
57295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlstruct S1 {
58295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  void nospec();
59295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  void allspec() throw(...);
60295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  void intspec() throw(int);
61295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  void emptyspec() throw();
62295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl};
63295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
64295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid callmem() {
65295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  S1 s;
66295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(s.nospec());
67295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(s.allspec());
68295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(s.intspec());
69295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(s.emptyspec());
70295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
71295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
72295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid (S1::*mpnospec)();
73295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid (S1::*mpallspec)() throw(...);
74295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid (S1::*mpintspec)() throw(int);
75295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid (S1::*mpemptyspec)() throw();
76295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
77295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid callmemptr() {
78295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  S1 s;
79295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N((s.*mpnospec)());
80295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N((s.*mpallspec)());
81295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N((s.*mpintspec)());
82295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P((s.*mpemptyspec)());
83295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
84295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
85295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlstruct S2 {
86295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  S2();
87295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  S2(int, int) throw();
88295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  void operator +();
89295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  void operator -() throw();
90295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  void operator +(int);
91295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  void operator -(int) throw();
92295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  operator int();
93295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  operator float() throw();
94295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl};
95295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
96295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid *operator new(__typeof__(sizeof(int)) sz, int) throw();
97295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
9872aa4c431b650800140457636c8481fd965f1534Eli Friedmanstruct IncompleteStruct;
9972aa4c431b650800140457636c8481fd965f1534Eli Friedman
1000b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redlstruct Bad1 {
1010b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl  ~Bad1() throw(int);
1020b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl};
1030b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redlstruct Bad2 {
1040b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl  void operator delete(void*) throw(int);
1050b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl};
1060b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl
107ebc93e176dad36fa8a28dd3a36c5b3dc7630d87dEli Friedmantypedef int X;
108ebc93e176dad36fa8a28dd3a36c5b3dc7630d87dEli Friedman
109295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid implicits() {
110295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(new int);
111295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(new (0) int);
1120b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl  P(delete (int*)0);
11372aa4c431b650800140457636c8481fd965f1534Eli Friedman  P(delete (IncompleteStruct*)0);
1140b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl  N(delete (Bad1*)0);
1150b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl  N(delete (Bad2*)0);
116295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(S2());
117295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(S2(0, 0));
118295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  S2 s;
119295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(+s);
120295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(-s);
121295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(s + 0);
122295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(s - 0);
123295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(static_cast<int>(s));
124295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(static_cast<float>(s));
1250b34cf7399e61ef33dc5a3af405351822eeb5f3eSebastian Redl  N(Bad1());
126ebc93e176dad36fa8a28dd3a36c5b3dc7630d87dEli Friedman  P(X().~X());
127295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
128295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
129295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlstruct V {
130295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  virtual ~V() throw();
131295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl};
132295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlstruct D : V {};
133295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
134295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid dyncast() {
135295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  V *pv = 0;
136295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  D *pd = 0;
137295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(dynamic_cast<V&>(*pd));
138295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(dynamic_cast<V*>(pd));
139295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(dynamic_cast<D&>(*pv));
140295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(dynamic_cast<D*>(pv));
141295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
142295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
143295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlnamespace std {
144295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  struct type_info {};
145295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
146295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
147295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid idtype() {
148295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(typeid(V));
149295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(typeid((V*)0));
150295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(typeid(*(S1*)0));
151295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  N(typeid(*(V*)0));
152295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
153295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl
154295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redlvoid uneval() {
155295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(sizeof(typeid(*(V*)0)));
156295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl  P(typeid(typeid(*(V*)0)));
157295995c9c3196416372c9cd35d9cedb6da37bd3dSebastian Redl}
1582a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl
1592a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redlstruct G1 {};
1602a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redlstruct G2 { int i; };
1612a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redlstruct G3 { S2 s; };
1622a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl
1632a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redlvoid gencon() {
1642a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  P(G1());
1652a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  P(G2());
1662a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  N(G3());
1672a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl}
1682a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl
169be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedmantemplate <class T> void f(T&&) noexcept;
1702a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redltemplate <typename T, bool b>
1712a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redlvoid late() {
1722a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  B(b, typeid(*(T*)0));
1732a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  B(b, T(1));
1742a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  B(b, static_cast<T>(S2(0, 0)));
1752a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  B(b, S1() + T());
176be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman  P(f(T()));
177be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman  P(new (0) T);
178be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman  P(delete (T*)0);
1792a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl}
1802a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redlstruct S3 {
1812a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  virtual ~S3() throw();
1822a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  S3() throw();
1832a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  explicit S3(int);
1842a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  S3(const S2&);
1852a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl};
186be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedmantemplate <class T> T&& f2() noexcept;
187be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedmantemplate <typename T>
188be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedmanvoid late2() {
189be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman  P(dynamic_cast<S3&>(f2<T&>()));
190be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman}
1912a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redlvoid operator +(const S1&, float) throw();
1922a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redlvoid operator +(const S1&, const S3&);
1932a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redlvoid tlate() {
1942a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  late<float, true>();
1952a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl  late<S3, false>();
196be57cf41fb55b48e3f889787960b3ac2eb5e4dbdEli Friedman  late2<S3>();
1972a822c0c554a7b82ea2cb0f7545e4ed1062f29fcSebastian Redl}
198