sema.cpp revision abea951c34876a5374d0e3678c7989b225c5c895
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++0x -fms-extensions %s 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define P(e) static_assert(noexcept(e), "expected nothrow") 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define N(e) static_assert(!noexcept(e), "expected throw") 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define B(b, e) static_assert(b == noexcept(e), "expectation failed") 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void simple() { 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) P(0); 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) P(0 + 0); 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int i; 11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) P(i); 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) P(sizeof(0)); 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) P(static_cast<int>(0)); 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) N(throw 0); 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) N((throw 0, 0)); 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void nospec(); 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void allspec() throw(...); 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void intspec() throw(int); 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid emptyspec() throw(); 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void nothrowattr() __attribute__((nothrow)); 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void call() { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) N(nospec()); 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) N(allspec()); 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) N(intspec()); 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch P(emptyspec()); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) P(nothrowattr()); 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void (*pnospec)(); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void (*pallspec)() throw(...); 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void (*pintspec)() throw(int); 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void (*pemptyspec)() throw(); 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void callptr() { 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) N(pnospec()); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) N((*pnospec)()); 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) N(pallspec()); 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) N((*pallspec)()); 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch N(pintspec()); 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch N((*pintspec)()); 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) P(pemptyspec()); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) P((*pemptyspec)()); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct S1 { 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void nospec(); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void allspec() throw(...); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void intspec() throw(int); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void emptyspec() throw(); 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 55void callmem() { 56 S1 s; 57 N(s.nospec()); 58 N(s.allspec()); 59 N(s.intspec()); 60 P(s.emptyspec()); 61} 62 63void (S1::*mpnospec)(); 64void (S1::*mpallspec)() throw(...); 65void (S1::*mpintspec)() throw(int); 66void (S1::*mpemptyspec)() throw(); 67 68void callmemptr() { 69 S1 s; 70 N((s.*mpnospec)()); 71 N((s.*mpallspec)()); 72 N((s.*mpintspec)()); 73 P((s.*mpemptyspec)()); 74} 75 76struct S2 { 77 S2(); 78 S2(int, int) throw(); 79 void operator +(); 80 void operator -() throw(); 81 void operator +(int); 82 void operator -(int) throw(); 83 operator int(); 84 operator float() throw(); 85}; 86 87void *operator new(__typeof__(sizeof(int)) sz, int) throw(); 88 89struct Bad1 { 90 ~Bad1() throw(int); 91}; 92struct Bad2 { 93 void operator delete(void*) throw(int); 94}; 95 96void implicits() { 97 N(new int); 98 P(new (0) int); 99 P(delete (int*)0); 100 N(delete (Bad1*)0); 101 N(delete (Bad2*)0); 102 N(S2()); 103 P(S2(0, 0)); 104 S2 s; 105 N(+s); 106 P(-s); 107 N(s + 0); 108 P(s - 0); 109 N(static_cast<int>(s)); 110 P(static_cast<float>(s)); 111 N(Bad1()); 112} 113 114struct V { 115 virtual ~V() throw(); 116}; 117struct D : V {}; 118 119void dyncast() { 120 V *pv = 0; 121 D *pd = 0; 122 P(dynamic_cast<V&>(*pd)); 123 P(dynamic_cast<V*>(pd)); 124 N(dynamic_cast<D&>(*pv)); 125 P(dynamic_cast<D*>(pv)); 126} 127 128namespace std { 129 struct type_info {}; 130} 131 132void idtype() { 133 P(typeid(V)); 134 P(typeid((V*)0)); 135 P(typeid(*(S1*)0)); 136 N(typeid(*(V*)0)); 137} 138 139void uneval() { 140 P(sizeof(typeid(*(V*)0))); 141 P(typeid(typeid(*(V*)0))); 142} 143 144struct G1 {}; 145struct G2 { int i; }; 146struct G3 { S2 s; }; 147 148void gencon() { 149 P(G1()); 150 P(G2()); 151 N(G3()); 152} 153 154template <typename T, bool b> 155void late() { 156 B(b, typeid(*(T*)0)); 157 B(b, T(1)); 158 B(b, static_cast<T>(S2(0, 0))); 159 B(b, S1() + T()); 160} 161struct S3 { 162 virtual ~S3() throw(); 163 S3() throw(); 164 explicit S3(int); 165 S3(const S2&); 166}; 167void operator +(const S1&, float) throw(); 168void operator +(const S1&, const S3&); 169void tlate() { 170 late<float, true>(); 171 late<S3, false>(); 172} 173