From: John McCall Date: Thu, 25 Feb 2010 10:46:05 +0000 (+0000) Subject: When comparing two method overload candidates during overload diagnostics, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3a8133727659077d0c918226e5dad6c16c8274f6;p=clang When comparing two method overload candidates during overload diagnostics, skip the object argument conversion if either of the candidates didn't initialize it. Fixes PR6421, which is such a very straightforward extension of PR6398 that I should have worked it into the last test case (and therefore caught it then). Ah well. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97135 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 7208b90939..cfb4b91996 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -4797,7 +4797,8 @@ struct CompareOverloadCandidatesForDisplay { assert(L->Conversions.size() == R->Conversions.size()); int leftBetter = 0; - for (unsigned I = 0, E = L->Conversions.size(); I != E; ++I) { + unsigned I = (L->IgnoreObjectArgument || R->IgnoreObjectArgument); + for (unsigned E = L->Conversions.size(); I != E; ++I) { switch (S.CompareImplicitConversionSequences(L->Conversions[I], R->Conversions[I])) { case ImplicitConversionSequence::Better: diff --git a/test/SemaCXX/overload-call.cpp b/test/SemaCXX/overload-call.cpp index 21b5da21d8..38a26d38ca 100644 --- a/test/SemaCXX/overload-call.cpp +++ b/test/SemaCXX/overload-call.cpp @@ -360,12 +360,13 @@ namespace DerivedToBaseVsVoid { } } -// PR 6398 +// PR 6398 + PR 6421 namespace test4 { class A; class B { static void foo(); // expected-note {{not viable}} static void foo(int*); // expected-note {{not viable}} + static void foo(long*); // expected-note {{not viable}} void bar(A *a) { foo(a); // expected-error {{no matching function for call}}