From 29f9d395683b0aa99145ef7ba0c635f4b364df5c Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 9 Oct 2009 00:13:15 +0000 Subject: [PATCH] Improve on reporting ambiguity involving built-in candidates. I still don't like it but it is improvement over what we had. llvm-svn: 83603 --- .../clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/lib/Sema/Sema.h | 4 +++- clang/lib/Sema/SemaOverload.cpp | 19 +++++++++---------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index fdd644235e59..40e555cbfcac 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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">; diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index f85c1a821b9c..9f6db69740f8 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -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); diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 4de8366816db..f2142c508941 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -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()) { - C1 = PointerTy->getPointeeType(); - C1 = C1.getUnqualifiedType(); + C1 = PointerTy->getPointeeType().getUnqualifiedType(); if (!isa(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: