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:
parent
ccacd0df19
commit
13b4e68642
|
@ -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">;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue