Home | History | Annotate | Download | only in except.spec
      1 // RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s
      2 
      3 // Simple parser tests, dynamic specification.
      4 
      5 namespace dyn {
      6 
      7   struct X { };
      8 
      9   struct Y { };
     10 
     11   void f() throw() { }
     12 
     13   void g(int) throw(X) { }
     14 
     15   void h() throw(X, Y) { }
     16 
     17   class Class {
     18     void foo() throw (X, Y) { }
     19   };
     20 
     21   void (*fptr)() throw();
     22 
     23 }
     24 
     25 // Simple parser tests, noexcept specification.
     26 
     27 namespace noex {
     28 
     29   void f1() noexcept { }
     30   void f2() noexcept (true) { }
     31   void f3() noexcept (false) { }
     32   void f4() noexcept (1 < 2) { }
     33 
     34   class CA1 {
     35     void foo() noexcept { }
     36     void bar() noexcept (true) { }
     37   };
     38 
     39   void (*fptr1)() noexcept;
     40   void (*fptr2)() noexcept (true);
     41 
     42 }
     43 
     44 namespace mix {
     45 
     46   void f() throw(int) noexcept { } // expected-error {{cannot have both}}
     47   void g() noexcept throw(int) { } // expected-error {{cannot have both}}
     48 
     49 }
     50 
     51 // Sema tests, noexcept specification
     52 
     53 namespace noex {
     54 
     55   struct A {};
     56 
     57   void g1() noexcept(A()); // expected-error {{not contextually convertible}}
     58   void g2(bool b) noexcept(b); // expected-error {{argument to noexcept specifier must be a constant expression}} expected-note {{read of non-const variable 'b'}} expected-note {{here}}
     59 
     60 }
     61 
     62 namespace noexcept_unevaluated {
     63   template<typename T> bool f(T) {
     64     T* x = 1;
     65   }
     66 
     67   template<typename T>
     68   void g(T x) noexcept((sizeof(T) == sizeof(int)) || noexcept(f(x))) { }
     69 
     70   void h() {
     71     g(1);
     72   }
     73 }
     74 
     75 namespace PR11084 {
     76   template<int X> struct A {
     77     static int f() noexcept(1/X) { return 10; }  // expected-error{{argument to noexcept specifier must be a constant expression}} expected-note{{division by zero}}
     78   };
     79 
     80   template<int X> void f() {
     81     int (*p)() noexcept(1/X); // expected-error{{argument to noexcept specifier must be a constant expression}} expected-note{{division by zero}}
     82   };
     83 
     84   void g() {
     85     A<0>::f(); // expected-note{{in instantiation of exception specification for 'f'}}
     86     f<0>(); // expected-note{{in instantiation of function template specialization}}
     87   }
     88 }
     89