diff options
author | John McCall <rjmccall@apple.com> | 2010-01-07 02:04:15 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-01-07 02:04:15 +0000 |
commit | 1eb3e1003d5cda4d47f54321d81d678c26981e7a (patch) | |
tree | fe2188348951fe3453610295682edb298514735d /lib/Sema/SemaOverload.cpp | |
parent | 782f2f52b78d8ca785110398a7f7b56b830b9ac7 (diff) |
Improve the lead diagnostic for C++ object subscript expressions with
no viable overloads. Use a different message when the class provides
no operator[] overloads at all; use it for operator(), too.
Partially addresses PR 5900.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92894 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaOverload.cpp')
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index cec167953c..d2bd4eea98 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -5449,16 +5449,17 @@ Sema::CreateOverloadedArraySubscriptExpr(SourceLocation LLoc, } case OR_No_Viable_Function: { - // No viable function; try to create a built-in operation, which will - // produce an error. Then, show the non-viable candidates. - OwningExprResult Result = - CreateBuiltinArraySubscriptExpr(move(Base), LLoc, move(Idx), RLoc); - assert(Result.isInvalid() && - "C++ subscript operator overloading is missing candidates!"); - if (Result.isInvalid()) - PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false, - "[]", LLoc); - return move(Result); + if (CandidateSet.empty()) + Diag(LLoc, diag::err_ovl_no_oper) + << Args[0]->getType() << /*subscript*/ 0 + << Args[0]->getSourceRange() << Args[1]->getSourceRange(); + else + Diag(LLoc, diag::err_ovl_no_viable_subscript) + << Args[0]->getType() + << Args[0]->getSourceRange() << Args[1]->getSourceRange(); + PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false, + "[]", LLoc); + return ExprError(); } case OR_Ambiguous: @@ -5712,9 +5713,14 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Object, break; case OR_No_Viable_Function: - Diag(Object->getSourceRange().getBegin(), - diag::err_ovl_no_viable_object_call) - << Object->getType() << Object->getSourceRange(); + if (CandidateSet.empty()) + Diag(Object->getSourceRange().getBegin(), diag::err_ovl_no_oper) + << Object->getType() << /*call*/ 1 + << Object->getSourceRange(); + else + Diag(Object->getSourceRange().getBegin(), + diag::err_ovl_no_viable_object_call) + << Object->getType() << Object->getSourceRange(); PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false); break; |