From: Sebastian Redl Date: Sun, 11 Oct 2009 09:11:23 +0000 (+0000) Subject: Types appearing more than once in a spec shouldn't matter. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5db4d908308576b0fc574138d4aa410c529785a6;p=clang Types appearing more than once in a spec shouldn't matter. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83766 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExceptionSpec.cpp b/lib/Sema/SemaExceptionSpec.cpp index 8720d81d6e..4171ecea8a 100644 --- a/lib/Sema/SemaExceptionSpec.cpp +++ b/lib/Sema/SemaExceptionSpec.cpp @@ -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 Types; + llvm::SmallPtrSet 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; diff --git a/test/SemaCXX/exception-spec.cpp b/test/SemaCXX/exception-spec.cpp index cf7089cc7c..bd22bf3ddd 100644 --- a/test/SemaCXX/exception-spec.cpp +++ b/test/SemaCXX/exception-spec.cpp @@ -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 { };