summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErich Keane <erich.keane@intel.com>2017-09-28 20:47:10 +0000
committerErich Keane <erich.keane@intel.com>2017-09-28 20:47:10 +0000
commit97dfc4ab28210e6b14a996eee1abc7c563182427 (patch)
tree2d4d665928c7db7a19df4b107541c305938caef2
parentc372e15c4e4a448e43924ad3405e81ed771c928c (diff)
downloadbcm5719-llvm-97dfc4ab28210e6b14a996eee1abc7c563182427.tar.gz
bcm5719-llvm-97dfc4ab28210e6b14a996eee1abc7c563182427.zip
[Sema] Correct nothrow inherited by noexcept
As reported in https://bugs.llvm.org/show_bug.cgi?id=33235, a noexcept function was unable to inherit from a nothrow defaulted constructor. Attribute "nothrow" is supposed to be semantically identical to noexcept, and in fact, a number of other places in the code treat them identically. This patch simply checks the RecordDecl for the correct attribute in the case where no other exception specifier was set. Differential Revision: https://reviews.llvm.org/D38209 llvm-svn: 314462
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp3
-rw-r--r--clang/test/SemaCXX/nothrow-as-noexcept-ctor.cpp26
2 files changed, 29 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 492694d07ef..82e112bb3f9 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -167,6 +167,9 @@ Sema::ImplicitExceptionSpecification::CalledDecl(SourceLocation CallLoc,
if (ComputedEST == EST_None)
return;
+ if (EST == EST_None && Method->hasAttr<NoThrowAttr>())
+ EST = EST_BasicNoexcept;
+
switch(EST) {
// If this function can throw any exceptions, make a note of that.
case EST_MSAny:
diff --git a/clang/test/SemaCXX/nothrow-as-noexcept-ctor.cpp b/clang/test/SemaCXX/nothrow-as-noexcept-ctor.cpp
new file mode 100644
index 00000000000..7cca414d7a6
--- /dev/null
+++ b/clang/test/SemaCXX/nothrow-as-noexcept-ctor.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 %s -fcxx-exceptions -fsyntax-only -Wexceptions -verify -std=c++14
+
+// expected-no-diagnostics
+struct Base {
+ __attribute__((nothrow)) Base() {}
+};
+
+struct Derived : Base {
+ Derived() noexcept = default;
+};
+
+struct Base2 {
+ Base2() noexcept {}
+};
+
+struct Derived2 : Base2 {
+ __attribute__((nothrow)) Derived2() = default;
+};
+
+struct Base3 {
+ __attribute__((nothrow)) Base3() {}
+};
+
+struct Derived3 : Base3 {
+ __attribute__((nothrow)) Derived3() = default;
+};
OpenPOWER on IntegriCloud