aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-10-09 00:13:15 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-10-09 00:13:15 +0000
commit16a5eac559730f4a7ec5ffdab3f236f51df85b63 (patch)
tree72c8cda947f1e2cd9dfac4669595304a104d0093
parentfb16c0a6d164faa697e57ce399034dd4cea2f490 (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.td2
-rw-r--r--lib/Sema/Sema.h4
-rw-r--r--lib/Sema/SemaOverload.cpp19
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: