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