Types appearing more than once in a spec shouldn't matter.

llvm-svn: 83766
This commit is contained in:
Sebastian Redl 2009-10-11 09:11:23 +00:00
parent 2dccb8571e
commit 6e4c871855
2 changed files with 14 additions and 5 deletions

View File

@ -117,16 +117,21 @@ bool Sema::CheckEquivalentExceptionSpec(
bool Success = true;
// Both have a definite exception spec. Collect the first set, then compare
// to the second.
llvm::SmallPtrSet<const Type*, 8> Types;
llvm::SmallPtrSet<const Type*, 8> OldTypes, NewTypes;
for (FunctionProtoType::exception_iterator I = Old->exception_begin(),
E = Old->exception_end(); I != E; ++I)
Types.insert(Context.getCanonicalType(*I).getTypePtr());
OldTypes.insert(Context.getCanonicalType(*I).getTypePtr());
for (FunctionProtoType::exception_iterator I = New->exception_begin(),
E = New->exception_end(); I != E && Success; ++I)
Success = Types.erase(Context.getCanonicalType(*I).getTypePtr());
E = New->exception_end(); I != E && Success; ++I) {
const Type *TypePtr = Context.getCanonicalType(*I).getTypePtr();
if(OldTypes.count(TypePtr))
NewTypes.insert(TypePtr);
else
Success = false;
}
Success = Success && Types.empty();
Success = Success && OldTypes.size() == NewTypes.size();
if (Success) {
return false;

View File

@ -62,6 +62,10 @@ void r7() throw(float); // expected-error {{exception specification in declarati
void r8() throw(int);
void r8() throw(const int);
// Multiple appearances don't matter.
void r9() throw(int, int);
void r9() throw(int, int);
struct A
{
};