erichkeane created this revision. 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. https://reviews.llvm.org/D38209 Files: lib/Sema/SemaDeclCXX.cpp test/SemaCXX/nothrow-as-noexcept-ctor.cpp Index: test/SemaCXX/nothrow-as-noexcept-ctor.cpp =================================================================== --- /dev/null +++ test/SemaCXX/nothrow-as-noexcept-ctor.cpp @@ -0,0 +1,27 @@ +// 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; +}; Index: lib/Sema/SemaDeclCXX.cpp =================================================================== --- lib/Sema/SemaDeclCXX.cpp +++ lib/Sema/SemaDeclCXX.cpp @@ -167,6 +167,10 @@ 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:
Index: test/SemaCXX/nothrow-as-noexcept-ctor.cpp =================================================================== --- /dev/null +++ test/SemaCXX/nothrow-as-noexcept-ctor.cpp @@ -0,0 +1,27 @@ +// 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; +}; Index: lib/Sema/SemaDeclCXX.cpp =================================================================== --- lib/Sema/SemaDeclCXX.cpp +++ lib/Sema/SemaDeclCXX.cpp @@ -167,6 +167,10 @@ 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:
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits