r285779 - More forcibly resolve exception specifications when checking a function
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 1 17:47:52 PDT 2016
Author: rsmith
Date: Tue Nov 1 19:47:52 2016
New Revision: 285779
URL: http://llvm.org/viewvc/llvm-project?rev=285779&view=rev
Log:
More forcibly resolve exception specifications when checking a function
redeclaration in C++1z mode. We need the exception specification in order for
the function's type to be complete.
Modified:
cfe/trunk/lib/Sema/SemaDecl.cpp
cfe/trunk/test/SemaCXX/cxx1z-noexcept-function-type.cpp
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=285779&r1=285778&r2=285779&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Nov 1 19:47:52 2016
@@ -2949,6 +2949,15 @@ bool Sema::MergeFunctionDecl(FunctionDec
// but do not necessarily update the type of New.
if (CheckEquivalentExceptionSpec(Old, New))
return true;
+ // If exceptions are disabled, we might not have resolved the exception spec
+ // of one or both declarations. Do so now in C++1z, so that we can properly
+ // compare the types.
+ if (getLangOpts().CPlusPlus1z) {
+ for (QualType T : {Old->getType(), New->getType()})
+ if (auto *FPT = T->getAs<FunctionProtoType>())
+ if (isUnresolvedExceptionSpec(FPT->getExceptionSpecType()))
+ ResolveExceptionSpec(New->getLocation(), FPT);
+ }
OldQType = Context.getCanonicalType(Old->getType());
NewQType = Context.getCanonicalType(New->getType());
Modified: cfe/trunk/test/SemaCXX/cxx1z-noexcept-function-type.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1z-noexcept-function-type.cpp?rev=285779&r1=285778&r2=285779&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx1z-noexcept-function-type.cpp (original)
+++ cfe/trunk/test/SemaCXX/cxx1z-noexcept-function-type.cpp Tue Nov 1 19:47:52 2016
@@ -89,3 +89,11 @@ namespace CompatWarning {
template<typename T> void h(...) = delete; // expected-note {{deleted}}
void test_h() { h<void>(nullptr); } // expected-error {{deleted}}
}
+
+namespace ImplicitExceptionSpec {
+ struct S {
+ ~S();
+ void f(const S &s = S());
+ };
+ S::~S() {}
+}
More information about the cfe-commits
mailing list