]> granicus.if.org Git - clang/commitdiff
Improve on reporting ambiguity involving built-in candidates.
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 9 Oct 2009 00:13:15 +0000 (00:13 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 9 Oct 2009 00:13:15 +0000 (00:13 +0000)
I still don't like it but it is improvement over what we had.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/Sema.h
lib/Sema/SemaOverload.cpp

index fdd644235e5927ef10000a1f485da090621eccd8..40e555cbfcacd0f16d7a94cd1cc59ed108cc84e3 100644 (file)
@@ -778,7 +778,7 @@ def err_ovl_template_candidate : Note<
   "candidate function template specialization %0">;
 def err_ovl_candidate_deleted : Note<
   "candidate function has been explicitly %select{made unavailable|deleted}0">;
-def err_ovl_builtin_candidate : Note<"built-in candidate function %0">;
+def err_ovl_builtin_candidate : Note<"built-in candidate function %0 for operator '%1'">;
 def err_ovl_no_viable_function_in_init : Error<
   "no matching constructor for initialization of %0">;
 def err_ovl_ambiguous_init : Error<"call to constructor of %0 is ambiguous">;
index f85c1a821b9c7c8ead0050c3995fa71a665526cf..9f6db69740f8a7c749e587a22d2364d676f9b772 100644 (file)
@@ -906,7 +906,9 @@ public:
                                        SourceLocation Loc,
                                        OverloadCandidateSet::iterator& Best);
   void PrintOverloadCandidates(OverloadCandidateSet& CandidateSet,
-                               bool OnlyViable);
+                         bool OnlyViable,
+                         BinaryOperator::Opcode Opc=(BinaryOperator::Opcode)0,
+                         SourceLocation Loc=SourceLocation());
 
   FunctionDecl *ResolveAddressOfOverloadedFunction(Expr *From, QualType ToType,
                                                    bool Complain);
index 4de8366816db9cf572b998e6eba8fdc88aa6a39f..f2142c50894103e2d7fd8a90ea73b7d34d8a0f64 100644 (file)
@@ -3690,11 +3690,12 @@ Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
            Ptr != CandidateTypes.pointer_end(); ++Ptr) {
         QualType C1Ty = (*Ptr);
         QualType C1;
+        unsigned CV1;
         if (const PointerType *PointerTy = C1Ty->getAs<PointerType>()) {
-          C1 = PointerTy->getPointeeType();
-          C1 = C1.getUnqualifiedType();
+          C1 = PointerTy->getPointeeType().getUnqualifiedType();
           if (!isa<RecordType>(C1))
             continue;
+          CV1 = PointerTy->getPointeeType().getCVRQualifiers();
         }
         for (BuiltinCandidateTypeSet::iterator
              MemPtr = CandidateTypes.member_pointer_begin(),
@@ -3708,7 +3709,6 @@ Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
           QualType ParamTypes[2] = { *Ptr, *MemPtr };
           // build CV12 T&
           QualType T = mptr->getPointeeType();
-          unsigned CV1 = (*Ptr).getCVRQualifiers();
           unsigned CV2 = T.getCVRQualifiers();
           T = Context.getCVRQualifiedType(T, (CV1 | CV2));
           QualType ResultTy = Context.getLValueReferenceType(T);
@@ -3972,7 +3972,9 @@ Sema::BestViableFunction(OverloadCandidateSet& CandidateSet,
 /// set. If OnlyViable is true, only viable candidates will be printed.
 void
 Sema::PrintOverloadCandidates(OverloadCandidateSet& CandidateSet,
-                              bool OnlyViable) {
+                              bool OnlyViable,
+                              BinaryOperator::Opcode Opc,
+                              SourceLocation OpLoc) {
   OverloadCandidateSet::iterator Cand = CandidateSet.begin(),
                              LastCand = CandidateSet.end();
   for (; Cand != LastCand; ++Cand) {
@@ -4045,17 +4047,14 @@ Sema::PrintOverloadCandidates(OverloadCandidateSet& CandidateSet,
         Diag(Cand->Surrogate->getLocation(), diag::err_ovl_surrogate_cand)
           << FnType;
       } else if (OnlyViable) {
-        // FIXME: We need to get the identifier in here
-        // FIXME: Do we want the error message to point at the operator?
-        // (built-ins won't have a location)
-        // FIXME: can we get some kind of stable location for this?
         QualType FnType
           = Context.getFunctionType(Cand->BuiltinTypes.ResultTy,
                                     Cand->BuiltinTypes.ParamTypes,
                                     Cand->Conversions.size(),
                                     false, 0);
 
-        Diag(SourceLocation(), diag::err_ovl_builtin_candidate) << FnType;
+        Diag(OpLoc, diag::err_ovl_builtin_candidate) << FnType <<
+         BinaryOperator::getOpcodeStr(Opc);
       }
     }
   }
@@ -4714,7 +4713,7 @@ Sema::CreateOverloadedBinOp(SourceLocation OpLoc,
       Diag(OpLoc,  diag::err_ovl_ambiguous_oper)
           << BinaryOperator::getOpcodeStr(Opc)
           << Args[0]->getSourceRange() << Args[1]->getSourceRange();
-      PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/true);
+      PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/true, Opc, OpLoc);
       return ExprError();
 
     case OR_Deleted: