Files
clang-p2996/clang/test/CXX/except/except.spec/p2-places.cpp
Richard Smith 3c4f8d2e96 P0012R1: Make exception specifications be part of the type system. This
implements the bulk of the change (modifying the type system to include
exception specifications), but not all the details just yet.

llvm-svn: 284337
2016-10-16 17:54:23 +00:00

66 lines
2.0 KiB
C++

// RUN: %clang_cc1 -std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s
// Tests where specs are allowed and where they aren't.
namespace dyn {
// Straight from the standard:
// Plain function with spec
void f() throw(int);
// Pointer to function with spec
void (*fp)() throw (int);
// Function taking reference to function with spec
void g(void pfa() throw(int));
// Typedef for pointer to function with spec
typedef int (*pf)() throw(int); // expected-error {{specifications are not allowed in typedefs}}
// Some more:
// Function returning function with spec
void (*h())() throw(int);
// Ultimate parser thrill: function with spec returning function with spec and
// taking pointer to function with spec.
// The actual function throws int, the return type double, the argument float.
void (*i() throw(int))(void (*)() throw(float)) throw(double);
// Pointer to pointer to function taking function with spec
void (**k)(void pfa() throw(int)); // no-error
// Pointer to pointer to function with spec
void (**j)() throw(int); // expected-error {{not allowed beyond a single}}
// 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 {
// These parallel those from above.
void f() noexcept(false);
void (*fp)() noexcept(false);
void g(void pfa() noexcept(false));
typedef int (*pf)() noexcept(false); // expected-error {{specifications are not allowed in typedefs}}
void (*h())() noexcept(false);
void (*i() noexcept(false))(void (*)() noexcept(true)) noexcept(false);
void (**k)(void pfa() noexcept(false)); // no-error
void (**j)() noexcept(false); // expected-error {{not allowed beyond a single}}
void (**(*h())())() noexcept(false); // expected-error {{not allowed beyond a single}}
}