r200815 - Don't mark decls with mismatching exception specs invalid in MS mode (PR18683)
Hans Wennborg
hans at hanshq.net
Tue Feb 4 18:37:58 PST 2014
Author: hans
Date: Tue Feb 4 20:37:58 2014
New Revision: 200815
URL: http://llvm.org/viewvc/llvm-project?rev=200815&view=rev
Log:
Don't mark decls with mismatching exception specs invalid in MS mode (PR18683)
We accept these with a warning in MS mode, but we would previously mark them
invalid, causing us not to emit code for them.
Differential Revision: http://llvm-reviews.chandlerc.com/D2681
Added:
cfe/trunk/test/CodeGenCXX/pr18661.cpp
Modified:
cfe/trunk/lib/Sema/SemaExceptionSpec.cpp
Modified: cfe/trunk/lib/Sema/SemaExceptionSpec.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExceptionSpec.cpp?rev=200815&r1=200814&r2=200815&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExceptionSpec.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExceptionSpec.cpp Tue Feb 4 20:37:58 2014
@@ -155,9 +155,13 @@ bool Sema::CheckEquivalentExceptionSpec(
bool IsOperatorNew = OO == OO_New || OO == OO_Array_New;
bool MissingExceptionSpecification = false;
bool MissingEmptyExceptionSpecification = false;
+
unsigned DiagID = diag::err_mismatched_exception_spec;
- if (getLangOpts().MicrosoftExt)
+ bool ReturnValueOnError = true;
+ if (getLangOpts().MicrosoftExt) {
DiagID = diag::warn_mismatched_exception_spec;
+ ReturnValueOnError = false;
+ }
// Check the types as written: they must match before any exception
// specification adjustment is applied.
@@ -182,9 +186,9 @@ bool Sema::CheckEquivalentExceptionSpec(
}
// The failure was something other than an missing exception
- // specification; return an error.
+ // specification; return an error, except in MS mode where this is a warning.
if (!MissingExceptionSpecification)
- return true;
+ return ReturnValueOnError;
const FunctionProtoType *NewProto =
New->getType()->castAs<FunctionProtoType>();
@@ -302,10 +306,14 @@ bool Sema::CheckEquivalentExceptionSpec(
const FunctionProtoType *New, SourceLocation NewLoc) {
unsigned DiagID = diag::err_mismatched_exception_spec;
if (getLangOpts().MicrosoftExt)
- DiagID = diag::warn_mismatched_exception_spec;
- return CheckEquivalentExceptionSpec(PDiag(DiagID),
- PDiag(diag::note_previous_declaration),
- Old, OldLoc, New, NewLoc);
+ DiagID = diag::warn_mismatched_exception_spec;
+ bool Result = CheckEquivalentExceptionSpec(PDiag(DiagID),
+ PDiag(diag::note_previous_declaration), Old, OldLoc, New, NewLoc);
+
+ // In Microsoft mode, mismatching exception specifications just cause a warning.
+ if (getLangOpts().MicrosoftExt)
+ return false;
+ return Result;
}
/// CheckEquivalentExceptionSpec - Check if the two types have compatible
Added: cfe/trunk/test/CodeGenCXX/pr18661.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/pr18661.cpp?rev=200815&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/pr18661.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/pr18661.cpp Tue Feb 4 20:37:58 2014
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 %s -triple %itanium_abi_triple -fcxx-exceptions -fms-extensions -emit-llvm -o - | FileCheck %s
+
+extern "C" {
+ void f();
+
+ // In MS mode we don't validate the exception specification.
+ void f() throw() {
+ }
+}
+
+// PR18661: Clang would fail to emit function definition with mismatching
+// exception specification, even though it was just treated as a warning.
+
+// CHECK: define void @f()
More information about the cfe-commits
mailing list