brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 3b39263 Raw
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