Home | History | Annotate | Download | only in expr.unary.noexcept
      1 // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 -fms-extensions -Wno-delete-incomplete -Wno-unused-value %s
      2 // expected-no-diagnostics
      3 
      4 #define P(e) static_assert(noexcept(e), "expected nothrow")
      5 #define N(e) static_assert(!noexcept(e), "expected throw")
      6 #define B(b, e) static_assert(b == noexcept(e), "expectation failed")
      7 
      8 void simple() {
      9   P(0);
     10   P(0 + 0);
     11   int i;
     12   P(i);
     13   P(sizeof(0));
     14   P(static_cast<int>(0));
     15   N(throw 0);
     16   N((throw 0, 0));
     17 }
     18 
     19 void nospec();
     20 void allspec() throw(...);
     21 void intspec() throw(int);
     22 void emptyspec() throw();
     23 void nothrowattr() __attribute__((nothrow));
     24 void noexcept_true() noexcept;
     25 void noexcept_false() noexcept(false);
     26 
     27 void call() {
     28   N(nospec());
     29   N(allspec());
     30   N(intspec());
     31   P(emptyspec());
     32   P(nothrowattr());
     33   P(noexcept_true());
     34   N(noexcept_false());
     35 }
     36 
     37 void (*pnospec)();
     38 void (*pallspec)() throw(...);
     39 void (*pintspec)() throw(int);
     40 void (*pemptyspec)() throw();
     41 
     42 typedef void (*funcptr)();
     43 funcptr returnsptr() throw();
     44 
     45 void callptr() {
     46   N(pnospec());
     47   N((*pnospec)());
     48   N(pallspec());
     49   N((*pallspec)());
     50   N(pintspec());
     51   N((*pintspec)());
     52   P(pemptyspec());
     53   P((*pemptyspec)());
     54   N(returnsptr()());
     55 }
     56 
     57 struct S1 {
     58   void nospec();
     59   void allspec() throw(...);
     60   void intspec() throw(int);
     61   void emptyspec() throw();
     62 };
     63 
     64 void callmem() {
     65   S1 s;
     66   N(s.nospec());
     67   N(s.allspec());
     68   N(s.intspec());
     69   P(s.emptyspec());
     70 }
     71 
     72 void (S1::*mpnospec)();
     73 void (S1::*mpallspec)() throw(...);
     74 void (S1::*mpintspec)() throw(int);
     75 void (S1::*mpemptyspec)() throw();
     76 
     77 void callmemptr() {
     78   S1 s;
     79   N((s.*mpnospec)());
     80   N((s.*mpallspec)());
     81   N((s.*mpintspec)());
     82   P((s.*mpemptyspec)());
     83 }
     84 
     85 struct S2 {
     86   S2();
     87   S2(int, int) throw();
     88   void operator +();
     89   void operator -() throw();
     90   void operator +(int);
     91   void operator -(int) throw();
     92   operator int();
     93   operator float() throw();
     94 };
     95 
     96 void *operator new(__typeof__(sizeof(int)) sz, int) throw();
     97 
     98 struct IncompleteStruct;
     99 
    100 struct Bad1 {
    101   ~Bad1() throw(int);
    102 };
    103 struct Bad2 {
    104   void operator delete(void*) throw(int);
    105 };
    106 
    107 typedef int X;
    108 
    109 void implicits() {
    110   N(new int);
    111   P(new (0) int);
    112   P(delete (int*)0);
    113   P(delete (IncompleteStruct*)0);
    114   N(delete (Bad1*)0);
    115   N(delete (Bad2*)0);
    116   N(S2());
    117   P(S2(0, 0));
    118   S2 s;
    119   N(+s);
    120   P(-s);
    121   N(s + 0);
    122   P(s - 0);
    123   N(static_cast<int>(s));
    124   P(static_cast<float>(s));
    125   N(Bad1());
    126   P(X().~X());
    127 }
    128 
    129 struct V {
    130   virtual ~V() throw();
    131 };
    132 struct D : V {};
    133 
    134 void dyncast() {
    135   V *pv = 0;
    136   D *pd = 0;
    137   P(dynamic_cast<V&>(*pd));
    138   P(dynamic_cast<V*>(pd));
    139   N(dynamic_cast<D&>(*pv));
    140   P(dynamic_cast<D*>(pv));
    141 }
    142 
    143 namespace std {
    144   struct type_info {};
    145 }
    146 
    147 void idtype() {
    148   P(typeid(V));
    149   P(typeid((V*)0));
    150   P(typeid(*(S1*)0));
    151   N(typeid(*(V*)0));
    152 }
    153 
    154 void uneval() {
    155   P(sizeof(typeid(*(V*)0)));
    156   P(typeid(typeid(*(V*)0)));
    157 }
    158 
    159 struct G1 {};
    160 struct G2 { int i; };
    161 struct G3 { S2 s; };
    162 
    163 void gencon() {
    164   P(G1());
    165   P(G2());
    166   N(G3());
    167 }
    168 
    169 template <class T> void f(T&&) noexcept;
    170 template <typename T, bool b>
    171 void late() {
    172   B(b, typeid(*(T*)0));
    173   B(b, T(1));
    174   B(b, static_cast<T>(S2(0, 0)));
    175   B(b, S1() + T());
    176   P(f(T()));
    177   P(new (0) T);
    178   P(delete (T*)0);
    179 }
    180 struct S3 {
    181   virtual ~S3() throw();
    182   S3() throw();
    183   explicit S3(int);
    184   S3(const S2&);
    185 };
    186 template <class T> T&& f2() noexcept;
    187 template <typename T>
    188 void late2() {
    189   P(dynamic_cast<S3&>(f2<T&>()));
    190 }
    191 void operator +(const S1&, float) throw();
    192 void operator +(const S1&, const S3&);
    193 void tlate() {
    194   late<float, true>();
    195   late<S3, false>();
    196   late2<S3>();
    197 }
    198