diff options
author | Kaelyn Uhrain <rikka@google.com> | 2013-07-31 17:38:24 +0000 |
---|---|---|
committer | Kaelyn Uhrain <rikka@google.com> | 2013-07-31 17:38:24 +0000 |
commit | 0c51de4ab1ae11f105c0c9bf7f7deb603b3a67e2 (patch) | |
tree | 7e536d555f971077184fc5bcae6053bc9404d1c7 /clang/lib/Sema/SemaOverload.cpp | |
parent | 374089e7b888f97fe45c0f128a10ec261d5fd301 (diff) | |
download | bcm5719-llvm-0c51de4ab1ae11f105c0c9bf7f7deb603b3a67e2.tar.gz bcm5719-llvm-0c51de4ab1ae11f105c0c9bf7f7deb603b3a67e2.zip |
Improve the diagnostic experience, including adding recovery, for
changing '->' to '.' when there is no operator-> defined for a class.
llvm-svn: 187504
Diffstat (limited to 'clang/lib/Sema/SemaOverload.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 7ebcd88fe5f..72415518930 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -11463,7 +11463,8 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj, /// (if one exists), where @c Base is an expression of class type and /// @c Member is the name of the member we're trying to find. ExprResult -Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc) { +Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, + bool *NoArrowOperatorFound) { assert(Base->getType()->isRecordType() && "left-hand side must have class type"); @@ -11509,6 +11510,12 @@ Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc) { case OR_No_Viable_Function: if (CandidateSet.empty()) { QualType BaseType = Base->getType(); + if (NoArrowOperatorFound) { + // Report this specific error to the caller instead of emitting a + // diagnostic, as requested. + *NoArrowOperatorFound = true; + return ExprError(); + } Diag(OpLoc, diag::err_typecheck_member_reference_arrow) << BaseType << Base->getSourceRange(); if (BaseType->isRecordType() && !BaseType->isPointerType()) { |