diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-10-09 00:13:15 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-10-09 00:13:15 +0000 |
commit | 16a5eac559730f4a7ec5ffdab3f236f51df85b63 (patch) | |
tree | 72c8cda947f1e2cd9dfac4669595304a104d0093 | |
parent | fb16c0a6d164faa697e57ce399034dd4cea2f490 (diff) |
Improve on reporting ambiguity involving built-in candidates.
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
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | lib/Sema/Sema.h | 4 | ||||
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 19 |
3 files changed, 13 insertions, 12 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index fdd644235e..40e555cbfc 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/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/lib/Sema/Sema.h b/lib/Sema/Sema.h index f85c1a821b..9f6db69740 100644 --- a/lib/Sema/Sema.h +++ b/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/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 4de8366816..f2142c5089 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/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<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: |