Author: erichkeane Date: Fri May 31 07:26:19 2019 New Revision: 362225 URL: http://llvm.org/viewvc/llvm-project?rev=362225&view=rev Log: Fix for PR42089, regression from r362119
The implementation of the NoThrow ExceptionSpecificationType missed a switch statement for forming the diagnostic when an out-of-line member redeclaration misses the exception specification. This patch adds the correct case statement. Modified: cfe/trunk/lib/Sema/SemaExceptionSpec.cpp cfe/trunk/test/SemaCXX/MicrosoftExtensions.cpp Modified: cfe/trunk/lib/Sema/SemaExceptionSpec.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExceptionSpec.cpp?rev=362225&r1=362224&r2=362225&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExceptionSpec.cpp (original) +++ cfe/trunk/lib/Sema/SemaExceptionSpec.cpp Fri May 31 07:26:19 2019 @@ -381,6 +381,11 @@ bool Sema::CheckEquivalentExceptionSpec( // when declaring a replaceable global allocation function. DiagID = diag::ext_missing_exception_specification; ReturnValueOnError = false; + } else if (ESI.Type == EST_NoThrow) { + // Allow missing attribute 'nothrow' in redeclarations, since this is a very + // common omission. + DiagID = diag::ext_missing_exception_specification; + ReturnValueOnError = false; } else { DiagID = diag::err_missing_exception_specification; ReturnValueOnError = true; @@ -421,7 +426,9 @@ bool Sema::CheckEquivalentExceptionSpec( OldProto->getNoexceptExpr()->printPretty(OS, nullptr, getPrintingPolicy()); OS << ")"; break; - + case EST_NoThrow: + OS <<"__attribute__((nothrow))"; + break; default: llvm_unreachable("This spec type is compatible with none."); } Modified: cfe/trunk/test/SemaCXX/MicrosoftExtensions.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/MicrosoftExtensions.cpp?rev=362225&r1=362224&r2=362225&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/MicrosoftExtensions.cpp (original) +++ cfe/trunk/test/SemaCXX/MicrosoftExtensions.cpp Fri May 31 07:26:19 2019 @@ -517,6 +517,15 @@ void PR34109(int* a) { delete a; } +namespace PR42089 { + struct S { + __attribute__((nothrow)) void Foo(); // expected-note {{previous declaration is here}} + __attribute__((nothrow)) void Bar(); + }; + void S::Foo(){} // expected-warning {{is missing exception specification}} + __attribute__((nothrow)) void S::Bar(){} +} + #elif TEST2 // Check that __unaligned is not recognized if MS extensions are not enabled _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits