diff options
author | Kaelyn Uhrain <rikka@google.com> | 2013-07-11 22:38:30 +0000 |
---|---|---|
committer | Kaelyn Uhrain <rikka@google.com> | 2013-07-11 22:38:30 +0000 |
commit | 1bb5dbf6288899909f551b4905d8b79ddb3490c8 (patch) | |
tree | 215eda849553309ddc6eb59c3eee025892d7b95b /clang/lib/Sema/SemaOverload.cpp | |
parent | 04bd68407470536d2d2c6274b6b5dae754c1c9b0 (diff) | |
download | bcm5719-llvm-1bb5dbf6288899909f551b4905d8b79ddb3490c8.tar.gz bcm5719-llvm-1bb5dbf6288899909f551b4905d8b79ddb3490c8.zip |
Provide a fixit hint for changing '->' to '.' if there is no operator->
defined for a class.
llvm-svn: 186128
Diffstat (limited to 'clang/lib/Sema/SemaOverload.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 51e87ebba87..01fd582f5e4 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -11353,10 +11353,17 @@ Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc) { break; case OR_No_Viable_Function: - if (CandidateSet.empty()) - Diag(OpLoc, diag::err_typecheck_member_reference_arrow) - << Base->getType() << Base->getSourceRange(); - else + if (CandidateSet.empty()) { + QualType BaseType = Base->getType(); + if (BaseType->isRecordType() && !BaseType->isPointerType()) { + Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) + << BaseType << 1 << Base->getSourceRange() + << FixItHint::CreateReplacement(OpLoc, "."); + } else { + Diag(OpLoc, diag::err_typecheck_member_reference_arrow) + << BaseType << Base->getSourceRange(); + } + } else Diag(OpLoc, diag::err_ovl_no_viable_oper) << "operator->" << Base->getSourceRange(); CandidateSet.NoteCandidates(*this, OCD_AllCandidates, Base); |