]> granicus.if.org Git - clang/commitdiff
Improve the diagnostic used when an incompatible overload set is passed
authorJohn McCall <rjmccall@apple.com>
Tue, 2 Feb 2010 02:42:52 +0000 (02:42 +0000)
committerJohn McCall <rjmccall@apple.com>
Tue, 2 Feb 2010 02:42:52 +0000 (02:42 +0000)
as an argument during overload resolution.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95057 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaOverload.cpp
test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.call/p6.cpp

index 78b791c971c4532b9d3d267f5d59d296f80947a3..b5d378d0e35955b744f11dfa282e8a18bfe6bb1f 100644 (file)
@@ -957,6 +957,13 @@ def note_ovl_candidate_bad_conv_incomplete : Note<"candidate "
     "constructor (the implicit copy constructor)|"
     "function (the implicit copy assignment operator)}0%1 "
     "not viable: cannot convert argument of incomplete type %2 to %3">;
+def note_ovl_candidate_bad_overload : Note<"candidate "
+    "%select{function|function|constructor|"
+    "function |function |constructor |"
+    "constructor (the implicit default constructor)|"
+    "constructor (the implicit copy constructor)|"
+    "function (the implicit copy assignment operator)}0%1"
+    " not viable: no overload of %3 matching %2 for %ordinal4 argument">;
 def note_ovl_candidate_bad_conv : Note<"candidate "
     "%select{function|function|constructor|"
     "function |function |constructor |"
index 1eb5b38889e99f589f0caf1e3003968aeb01585c..83cbce7226161b2155e75c21274338bcf3dcdf10 100644 (file)
@@ -4450,6 +4450,24 @@ void DiagnoseBadConversion(Sema &S, OverloadCandidate *Cand, unsigned I) {
   QualType FromTy = Conv.Bad.getFromType();
   QualType ToTy = Conv.Bad.getToType();
 
+  if (FromTy == S.Context.OverloadTy) {
+    assert(FromExpr);
+    Expr *E = FromExpr->IgnoreParens();
+    if (isa<UnaryOperator>(E))
+      E = cast<UnaryOperator>(E)->getSubExpr()->IgnoreParens();
+    DeclarationName Name;
+    if (isa<UnresolvedLookupExpr>(E))
+      Name = cast<UnresolvedLookupExpr>(E)->getName();
+    else
+      Name = cast<UnresolvedMemberExpr>(E)->getMemberName();
+
+    S.Diag(Fn->getLocation(), diag::note_ovl_candidate_bad_overload)
+      << (unsigned) FnKind << FnDesc
+      << (FromExpr ? FromExpr->getSourceRange() : SourceRange())
+      << ToTy << Name << I+1;
+    return;
+  }
+
   // Do some hand-waving analysis to see if the non-viability is due
   // to a qualifier mismatch.
   CanQualType CFromTy = S.Context.getCanonicalType(FromTy);
index c1fc696baf58b7876c4c17e59bfe6614a412d05f..8f919f53159127859a000e1fe821c16602b8e2e1 100644 (file)
@@ -3,7 +3,7 @@
 namespace test0 {
   // FIXME: this second note is horrible.
   template<class T> void apply(T x, void (*f)(T)) { f(x); } // expected-note 2 {{failed template argument deduction}}\
-  // expected-note {{no known conversion from '<overloaded function type>' to 'void (*)(int)'}}
+  // expected-note {{no overload of 'temp2' matching 'void (*)(int)'}}
 
   template<class A> void temp(A);
   void test0() {