On Thu, May 1, 2014 at 2:15 PM, Kaelyn Takata <[email protected]> wrote: > Author: rikka > Date: Thu May 1 16:15:24 2014 > New Revision: 207796 > > URL: http://llvm.org/viewvc/llvm-project?rev=207796&view=rev > Log: > When sorting overload candidates, sort arity mismatches in ascending > order by the number of missing or extra parameters. This is useful if > there are more than a few overload candidates with arity mismatches, > particularly in the presence of -fshow-overloads=best. > > Modified: > cfe/trunk/lib/Sema/SemaOverload.cpp > cfe/trunk/test/Misc/error-limit-multiple-notes.cpp > > Modified: cfe/trunk/lib/Sema/SemaOverload.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=207796&r1=207795&r2=207796&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaOverload.cpp (original) > +++ cfe/trunk/lib/Sema/SemaOverload.cpp Thu May 1 16:15:24 2014 > @@ -9229,7 +9229,10 @@ static unsigned RankDeductionFailure(con > > struct CompareOverloadCandidatesForDisplay { > Sema &S; > - CompareOverloadCandidatesForDisplay(Sema &S) : S(S) {} > + size_t NumArgs; > + > + CompareOverloadCandidatesForDisplay(Sema &S, size_t nArgs) > + : S(S), NumArgs(nArgs) {} > > bool operator()(const OverloadCandidate *L, > const OverloadCandidate *R) { > @@ -9254,8 +9257,18 @@ struct CompareOverloadCandidatesForDispl > if (!L->Viable) { > // 1. Arity mismatches come after other candidates. > if (L->FailureKind == ovl_fail_too_many_arguments || > - L->FailureKind == ovl_fail_too_few_arguments) > + L->FailureKind == ovl_fail_too_few_arguments) { > + if (R->FailureKind == ovl_fail_too_many_arguments || > + R->FailureKind == ovl_fail_too_few_arguments) { > + int LDist = abs(L->Function->getNumParams() - NumArgs); > + int RDist = abs(R->Function->getNumParams() - NumArgs);
Fixed a couple of -Wabsolute-value warnings here in r207806. > + if (LDist == RDist) > + return L->FailureKind == ovl_fail_too_many_arguments && > + R->FailureKind == ovl_fail_too_few_arguments; > + return LDist < RDist; > + } > return false; > + } > if (R->FailureKind == ovl_fail_too_many_arguments || > R->FailureKind == ovl_fail_too_few_arguments) > return true; > @@ -9442,7 +9455,7 @@ void OverloadCandidateSet::NoteCandidate > } > > std::sort(Cands.begin(), Cands.end(), > - CompareOverloadCandidatesForDisplay(S)); > + CompareOverloadCandidatesForDisplay(S, Args.size())); > > bool ReportedAmbiguousConversions = false; > > > Modified: cfe/trunk/test/Misc/error-limit-multiple-notes.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/error-limit-multiple-notes.cpp?rev=207796&r1=207795&r2=207796&view=diff > ============================================================================== > --- cfe/trunk/test/Misc/error-limit-multiple-notes.cpp (original) > +++ cfe/trunk/test/Misc/error-limit-multiple-notes.cpp Thu May 1 16:15:24 > 2014 > @@ -4,20 +4,22 @@ > void foo(int); > void foo(double); > void foo(int, int); > +void foo(int, int, int, int); > > int main() > { > - foo(); > + foo(1, 2, 3); > } > > // error and note suppressed by error-limit > struct s1{}; > struct s1{}; > > -// CHECK: 10:5: error: no matching function for call to 'foo' > -// CHECK: 6:6: note: candidate function not viable: requires 2 arguments, > but 0 were provided > -// CHECK: 5:6: note: candidate function not viable: requires 1 argument, but > 0 were provided > -// CHECK: 4:6: note: candidate function not viable: requires 1 argument, but > 0 were provided > +// CHECK: 11:5: error: no matching function for call to 'foo' > +// CHECK: 6:6: note: candidate function not viable: requires 2 arguments, > but 3 were provided > +// CHECK: 7:6: note: candidate function not viable: requires 4 arguments, > but 3 were provided > +// CHECK: 5:6: note: candidate function not viable: requires 1 argument, but > 3 were provided > +// CHECK: 4:6: note: candidate function not viable: requires 1 argument, but > 3 were provided > // CHECK: fatal error: too many errors emitted, stopping now > -// CHECK-NOT: 15:8: error: redefinition of 's1' > -// CHECK-NOT: 14:8: note: previous definition is here > +// CHECK-NOT: 16:8: error: redefinition of 's1' > +// CHECK-NOT: 15:8: note: previous definition is here > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
