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