summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2019-09-17 20:29:10 +0000
committerReid Kleckner <rnk@google.com>2019-09-17 20:29:10 +0000
commit6f1f3cfc5ac2f3188370928668b8ca7d3f06d47f (patch)
treea3cfc26beab77a141c0ee5c5da5135d02f74e314 /clang/test
parent8a4d9f04b51afe079420cb65049ecc875418f72b (diff)
downloadbcm5719-llvm-6f1f3cfc5ac2f3188370928668b8ca7d3f06d47f.tar.gz
bcm5719-llvm-6f1f3cfc5ac2f3188370928668b8ca7d3f06d47f.zip
Ignore exception specifier mismatch when merging redeclarations
Exception specifiers are now part of the function type in C++17. Normally, it is illegal to redeclare the same function or specialize a template with a different exception specifier, but under -fms-compatibility, we accept it with a warning. Without this change, the function types would not match due to the exception specifier, and clang would claim that the types were "incompatible". Now we emit the warning and merge the redeclaration as we would in C++14 and earlier. Fixes PR42842, which is about compiling _com_ptr_t in C++17. Based on a patch by Alex Fusco <alexfusco@google.com>! Differential Revision: https://reviews.llvm.org/D67590 llvm-svn: 372178
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/SemaCXX/ms-exception-spec.cpp29
1 files changed, 28 insertions, 1 deletions
diff --git a/clang/test/SemaCXX/ms-exception-spec.cpp b/clang/test/SemaCXX/ms-exception-spec.cpp
index 60bfeba037a..cf460356c97 100644
--- a/clang/test/SemaCXX/ms-exception-spec.cpp
+++ b/clang/test/SemaCXX/ms-exception-spec.cpp
@@ -1,9 +1,36 @@
-// RUN: %clang_cc1 %s -fsyntax-only -verify -fms-compatibility -fexceptions -fcxx-exceptions
+// RUN: %clang_cc1 -std=c++11 %s -fsyntax-only -verify -fms-compatibility -fexceptions -fcxx-exceptions
+// RUN: %clang_cc1 -std=c++17 %s -fsyntax-only -verify -fms-compatibility -fexceptions -fcxx-exceptions
+// FIXME: Should -fms-compatibility soften these errors into warnings to match
+// MSVC? In practice, MSVC never implemented dynamic exception specifiers, so
+// there isn't much Windows code in the wild that uses them.
+#if __cplusplus >= 201703L
+// expected-error@+3 {{ISO C++17 does not allow dynamic exception specifications}}
+// expected-note@+2 {{use 'noexcept(false)' instead}}
+#endif
void f() throw(...) { }
namespace PR28080 {
struct S; // expected-note {{forward declaration}}
+#if __cplusplus >= 201703L
+// expected-error@+3 {{ISO C++17 does not allow dynamic exception specifications}}
+// expected-note@+2 {{use 'noexcept(false)' instead}}
+#endif
void fn() throw(S); // expected-warning {{incomplete type}} expected-note{{previous declaration}}
void fn() throw(); // expected-warning {{does not match previous declaration}}
}
+
+template <typename T> struct FooPtr {
+ template <typename U> FooPtr(U *p) : m_pT(nullptr) {}
+
+ template <>
+ // FIXME: It would be better if this note pointed at the primary template
+ // above.
+ // expected-note@+1 {{previous declaration is here}}
+ FooPtr(T *pInterface) throw() // expected-warning {{exception specification in declaration does not match previous declaration}}
+ : m_pT(pInterface) {}
+
+ T *m_pT;
+};
+struct Bar {};
+template struct FooPtr<Bar>; // expected-note {{requested here}}
OpenPOWER on IntegriCloud