]> granicus.if.org Git - clang/commitdiff
When complaining about ambiguous overload resolution for a unary or
authorDouglas Gregor <dgregor@apple.com>
Sat, 13 Nov 2010 20:06:38 +0000 (20:06 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sat, 13 Nov 2010 20:06:38 +0000 (20:06 +0000)
binary operator, provide the types.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaOverload.cpp
test/SemaCXX/overloaded-operator.cpp

index 27d77e461895727b2a13ad5ae3af70e0063a8533..61e5f07cbb77c4b80571a624a78c46aa0c43461f 100644 (file)
@@ -1328,8 +1328,10 @@ def err_ref_init_ambiguous : Error<
   "reference initialization of type %0 with initializer of type %1 is ambiguous">;
 def err_ovl_deleted_init : Error<
   "call to %select{unavailable|deleted}0 constructor of %1">;
-def err_ovl_ambiguous_oper : Error<
-  "use of overloaded operator '%0' is ambiguous">;
+def err_ovl_ambiguous_oper_unary : Error<
+  "use of overloaded operator '%0' is ambiguous (operand type %1)">;
+def err_ovl_ambiguous_oper_binary : Error<
+  "use of overloaded operator '%0' is ambiguous (with operand types %1 and %2)">;
 def err_ovl_no_viable_oper : Error<"no viable overloaded '%0'">;
 def err_ovl_deleted_oper : Error<
   "overload resolution selected %select{unavailable|deleted}0 operator '%1'">;
index f8c6f6971da13acd2394fac5a98d2494bd7c6af3..7c51548b2bb992fbf0d418fe2ab52f3e63aada7a 100644 (file)
@@ -7163,8 +7163,9 @@ Sema::CreateOverloadedUnaryOp(SourceLocation OpLoc, unsigned OpcIn,
       break;
 
     case OR_Ambiguous:
-      Diag(OpLoc,  diag::err_ovl_ambiguous_oper)
+      Diag(OpLoc,  diag::err_ovl_ambiguous_oper_unary)
           << UnaryOperator::getOpcodeStr(Opc)
+          << Input->getType()
           << Input->getSourceRange();
       CandidateSet.NoteCandidates(*this, OCD_ViableCandidates,
                                   Args, NumArgs,
@@ -7401,8 +7402,9 @@ Sema::CreateOverloadedBinOp(SourceLocation OpLoc,
     }
 
     case OR_Ambiguous:
-      Diag(OpLoc,  diag::err_ovl_ambiguous_oper)
+      Diag(OpLoc,  diag::err_ovl_ambiguous_oper_binary)
           << BinaryOperator::getOpcodeStr(Opc)
+          << Args[0]->getType() << Args[1]->getType()
           << Args[0]->getSourceRange() << Args[1]->getSourceRange();
       CandidateSet.NoteCandidates(*this, OCD_ViableCandidates, Args, 2,
                                   BinaryOperator::getOpcodeStr(Opc), OpLoc);
@@ -7543,8 +7545,10 @@ Sema::CreateOverloadedArraySubscriptExpr(SourceLocation LLoc,
     }
 
     case OR_Ambiguous:
-      Diag(LLoc,  diag::err_ovl_ambiguous_oper)
-          << "[]" << Args[0]->getSourceRange() << Args[1]->getSourceRange();
+      Diag(LLoc,  diag::err_ovl_ambiguous_oper_binary)
+          << "[]" 
+          << Args[0]->getType() << Args[1]->getType()
+          << Args[0]->getSourceRange() << Args[1]->getSourceRange();
       CandidateSet.NoteCandidates(*this, OCD_ViableCandidates, Args, 2,
                                   "[]", LLoc);
       return ExprError();
@@ -8013,8 +8017,8 @@ Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc) {
     return ExprError();
 
   case OR_Ambiguous:
-    Diag(OpLoc,  diag::err_ovl_ambiguous_oper)
-      << "->" << Base->getSourceRange();
+    Diag(OpLoc,  diag::err_ovl_ambiguous_oper_unary)
+      << "->" << Base->getType() << Base->getSourceRange();
     CandidateSet.NoteCandidates(*this, OCD_ViableCandidates, &Base, 1);
     return ExprError();
 
index a33ea5dede19e81945d22840baeabe6f95cdc324..a9d3f128e2b113d2360c070af93f4cefa3d940e4 100644 (file)
@@ -24,7 +24,7 @@ bool operator-(Z, Z); // expected-note{{candidate function}}
 
 void g(Y y, Z z) {
   y = y + z;
-  bool b = y - z; // expected-error{{use of overloaded operator '-' is ambiguous; candidates are:}}
+  bool b = y - z; // expected-error{{use of overloaded operator '-' is ambiguous}}
 }
 
 struct A {
@@ -37,7 +37,7 @@ bool operator==(A&, Z&); // expected-note 2{{candidate function}}
 
 void h(A a, const A ac, Z z) {
   make_A() == z;
-  a == z; // expected-error{{use of overloaded operator '==' is ambiguous; candidates are:}}
+  a == z; // expected-error{{use of overloaded operator '==' is ambiguous}}
   ac == z; // expected-error{{invalid operands to binary expression ('const A' and 'Z')}}
 }