summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-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