97 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s2 3// Simple parser tests, dynamic specification.4 5namespace 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 27namespace 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 44namespace 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 specification52 53namespace noex {54 55 struct A {};56 57 void g1() noexcept(A()); // expected-error {{value of type 'A' is not implicitly convertible to 'bool'}}58 void g2(bool b) noexcept(b); // expected-error {{noexcept specifier argument is not a constant expression}} expected-note {{function parameter 'b' with unknown value}} expected-note {{here}}59}60 61namespace noexcept_unevaluated {62 template<typename T> bool f(T) {63 T* x = 1;64 }65 66 template<typename T>67 void g(T x) noexcept((sizeof(T) == sizeof(int)) || noexcept(f(x))) { }68 69 void h() {70 g(1);71 }72}73 74namespace PR11084 {75template <int X> struct A {76 static int f() noexcept(1 / X) { return 10; } // expected-error{{noexcept specifier argument is not a constant expression}} expected-note{{division by zero}}77};78 79 template<int X> void f() {80 int (*p)() noexcept(1 / X); // expected-error{{noexcept specifier argument is not a constant expression}} expected-note{{division by zero}}81 };82 83 void g() {84 A<0>::f(); // expected-note{{in instantiation of exception specification for 'f'}}85 f<0>(); // expected-note{{in instantiation of function template specialization}}86 }87}88 89namespace FuncTmplNoexceptError {90 int a = 0;91 // expected-error@+1{{noexcept specifier argument is not a constant expression}}92 template <class T> T f() noexcept(a++){ return {};}93 void g(){94 f<int>();95 }96};97