diff options
Diffstat (limited to 'test/CXX/except/except.spec')
| -rw-r--r-- | test/CXX/except/except.spec/p2-places-1z.cpp | 17 | ||||
| -rw-r--r-- | test/CXX/except/except.spec/p2-places.cpp | 2 | ||||
| -rw-r--r-- | test/CXX/except/except.spec/p5-pointers.cpp | 12 |
3 files changed, 25 insertions, 6 deletions
diff --git a/test/CXX/except/except.spec/p2-places-1z.cpp b/test/CXX/except/except.spec/p2-places-1z.cpp new file mode 100644 index 0000000000000..619ea33b5349b --- /dev/null +++ b/test/CXX/except/except.spec/p2-places-1z.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -std=c++1z -fexceptions -fcxx-exceptions -fsyntax-only -verify %s + +// In C++1z, we can put an exception-specification on any function declarator; the +// corresponding paragraph from C++14 and before was deleted. +// expected-no-diagnostics + +void f() noexcept; +void (*fp)() noexcept; +void (**fpp)() noexcept; +void g(void (**pfa)() noexcept); +void (**h())() noexcept; + +template<typename T> struct A {}; +template<void() noexcept> struct B {}; +A<void() noexcept> a; +B<f> b; +auto *p = new decltype(f)**; diff --git a/test/CXX/except/except.spec/p2-places.cpp b/test/CXX/except/except.spec/p2-places.cpp index 67647fb043a98..ea842af898459 100644 --- a/test/CXX/except/except.spec/p2-places.cpp +++ b/test/CXX/except/except.spec/p2-places.cpp @@ -37,6 +37,8 @@ namespace dyn { // Pointer to function returning pointer to pointer to function with spec void (**(*h())())() throw(int); // expected-error {{not allowed beyond a single}} + // FIXME: Missing a lot of negative tests, primarily type-ids in various places + // We fail to diagnose all of those. } namespace noex { diff --git a/test/CXX/except/except.spec/p5-pointers.cpp b/test/CXX/except/except.spec/p5-pointers.cpp index fe4a264587f5a..dedc5bd376f92 100644 --- a/test/CXX/except/except.spec/p5-pointers.cpp +++ b/test/CXX/except/except.spec/p5-pointers.cpp @@ -41,25 +41,25 @@ void fnptrs() { // Assignment and initialization of function pointers. void (*t1)() throw() = &s1; // valid - t1 = &s2; // expected-error {{not superset}} expected-error {{incompatible type}} - t1 = &s3; // expected-error {{not superset}} expected-error {{incompatible type}} + t1 = &s2; // expected-error {{not superset}} + t1 = &s3; // expected-error {{not superset}} void (&t2)() throw() = s2; // expected-error {{not superset}} void (*t3)() throw(int) = &s2; // valid void (*t4)() throw(A) = &s1; // valid t4 = &s3; // valid t4 = &s4; // valid - t4 = &s5; // expected-error {{not superset}} expected-error {{incompatible type}} + t4 = &s5; // expected-error {{not superset}} void (*t5)() = &s1; // valid t5 = &s2; // valid t5 = &s6; // valid t5 = &s7; // valid - t1 = t3; // expected-error {{not superset}} expected-error {{incompatible type}} + t1 = t3; // expected-error {{not superset}} t3 = t1; // valid void (*t6)() throw(B1); - t6 = t4; // expected-error {{not superset}} expected-error {{incompatible type}} + t6 = t4; // expected-error {{not superset}} t4 = t6; // valid t5 = t1; // valid - t1 = t5; // expected-error {{not superset}} expected-error {{incompatible type}} + t1 = t5; // expected-error {{not superset}} // return types and arguments must match exactly, no inheritance allowed void (*(*t7)())() throw(B1) = &s8; // valid |
