summaryrefslogtreecommitdiffstats
path: root/test/CXX/except/except.spec/p4.cpp
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2012-12-02 13:20:44 +0000
committerdim <dim@FreeBSD.org>2012-12-02 13:20:44 +0000
commit056abd2059c65a3e908193aeae16fad98017437c (patch)
tree2732d02d7d51218d6eed98ac7fcfc5b8794896b5 /test/CXX/except/except.spec/p4.cpp
parentcc73504950eb7b5dff2dded9bedd67bc36d64641 (diff)
downloadFreeBSD-src-056abd2059c65a3e908193aeae16fad98017437c.zip
FreeBSD-src-056abd2059c65a3e908193aeae16fad98017437c.tar.gz
Vendor import of clang release_32 branch r168974 (effectively, 3.2 RC2):
http://llvm.org/svn/llvm-project/cfe/branches/release_32@168974
Diffstat (limited to 'test/CXX/except/except.spec/p4.cpp')
-rw-r--r--test/CXX/except/except.spec/p4.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/test/CXX/except/except.spec/p4.cpp b/test/CXX/except/except.spec/p4.cpp
new file mode 100644
index 0000000..1bf7018
--- /dev/null
+++ b/test/CXX/except/except.spec/p4.cpp
@@ -0,0 +1,36 @@
+// RUN: %clang_cc1 -std=c++11 %s -verify -fcxx-exceptions
+
+// We permit overriding an implicit exception specification with an explicit one
+// as an extension, for compatibility with existing code.
+
+struct S {
+ void a(); // expected-note {{here}}
+ ~S(); // expected-note {{here}}
+ void operator delete(void*); // expected-note {{here}}
+};
+
+void S::a() noexcept {} // expected-error {{does not match previous}}
+S::~S() noexcept {} // expected-warning {{function previously declared with an implicit exception specification redeclared with an explicit exception specification}}
+void S::operator delete(void*) noexcept {} // expected-warning {{function previously declared with an implicit exception specification redeclared with an explicit exception specification}}
+
+struct T {
+ void a() noexcept; // expected-note {{here}}
+ ~T() noexcept; // expected-note {{here}}
+ void operator delete(void*) noexcept; // expected-note {{here}}
+};
+
+void T::a() {} // expected-warning {{missing exception specification 'noexcept'}}
+T::~T() {} // expected-warning {{function previously declared with an explicit exception specification redeclared with an implicit exception specification}}
+void T::operator delete(void*) {} // expected-warning {{function previously declared with an explicit exception specification redeclared with an implicit exception specification}}
+
+
+// The extension does not extend to function templates.
+
+template<typename T> struct U {
+ T t;
+ ~U(); // expected-note {{here}}
+ void operator delete(void*); // expected-note {{here}}
+};
+
+template<typename T> U<T>::~U() noexcept(true) {} // expected-error {{exception specification in declaration does not match previous declaration}}
+template<typename T> void U<T>::operator delete(void*) noexcept(false) {} // expected-error {{exception specification in declaration does not match previous declaration}}
OpenPOWER on IntegriCloud