Downgrade err_mismatched_exception_spec to a ExtWarning in Microsoft mode. MSVC doesn't do any validation on exception specifications.

This remove 1 error when parsing MSVC stl lib with clang.

llvm-svn: 127961
This commit is contained in:
Francois Pichet 2011-03-19 23:05:18 +00:00
parent ccacd0df19
commit 13b4e68642
3 changed files with 17 additions and 24 deletions

View File

@ -551,6 +551,8 @@ def err_incomplete_in_exception_spec : Error<
"in exception specification">;
def err_mismatched_exception_spec : Error<
"exception specification in declaration does not match previous declaration">;
def war_mismatched_exception_spec : ExtWarn<
"exception specification in declaration does not match previous declaration">;
def err_override_exception_spec : Error<
"exception specification of overriding function is more lax than "
"base version">;

View File

@ -100,7 +100,11 @@ bool Sema::CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New) {
bool IsOperatorNew = OO == OO_New || OO == OO_Array_New;
bool MissingExceptionSpecification = false;
bool MissingEmptyExceptionSpecification = false;
if (!CheckEquivalentExceptionSpec(PDiag(diag::err_mismatched_exception_spec),
unsigned DiagID = diag::err_mismatched_exception_spec;
if (getLangOptions().Microsoft)
DiagID = diag::war_mismatched_exception_spec;
if (!CheckEquivalentExceptionSpec(PDiag(DiagID),
PDiag(diag::note_previous_declaration),
Old->getType()->getAs<FunctionProtoType>(),
Old->getLocation(),
@ -247,7 +251,7 @@ bool Sema::CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New) {
return false;
}
Diag(New->getLocation(), diag::err_mismatched_exception_spec);
Diag(New->getLocation(), DiagID);
Diag(Old->getLocation(), diag::note_previous_declaration);
return true;
}
@ -259,8 +263,11 @@ bool Sema::CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New) {
bool Sema::CheckEquivalentExceptionSpec(
const FunctionProtoType *Old, SourceLocation OldLoc,
const FunctionProtoType *New, SourceLocation NewLoc) {
unsigned DiagID = diag::err_mismatched_exception_spec;
if (getLangOptions().Microsoft)
DiagID = diag::war_mismatched_exception_spec;
return CheckEquivalentExceptionSpec(
PDiag(diag::err_mismatched_exception_spec),
PDiag(DiagID),
PDiag(diag::note_previous_declaration),
Old, OldLoc, New, NewLoc);
}
@ -339,14 +346,6 @@ bool Sema::CheckEquivalentExceptionSpec(const PartialDiagnostic &DiagID,
return true;
}
if (getLangOptions().Microsoft) {
// Treat throw(whatever) as throw(...) to be compatible with MS headers.
if (OldEST == EST_Dynamic)
OldEST = EST_MSAny;
if (NewEST == EST_Dynamic)
NewEST = EST_MSAny;
}
// The MS extension throw(...) is compatible with itself.
if (OldEST == EST_MSAny && NewEST == EST_MSAny)
return false;

View File

@ -4,21 +4,13 @@
// ::type_info is predeclared with forward class declartion
void f(const type_info &a);
// The following three are all equivalent when ms-extensions are on
void foo() throw(int);
void foo() throw(int, long);
void foo() throw(...);
// Microsoft doesn't validate exception specification.
void foo(); // expected-note {{previous declaration}}
void foo() throw(); // expected-warning {{exception specification in declaration does not match previous declaration}}
// Only nothrow specification is treated specially.
void foo() throw(); // expected-error {{exception specification in declaration does not match previous declaration}}
// throw(...)
void r3();
void r3() throw(...);
void r6() throw(...);
void r6() throw(int); // okay
void r6() throw(...); // expected-note {{previous declaration}}
void r6() throw(int); // expected-warning {{exception specification in declaration does not match previous declaration}}
struct Base {
virtual void f2();