diff options
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 12 | ||||
| -rw-r--r-- | clang/test/SemaCXX/arrow-operator.cpp | 22 | 
2 files changed, 29 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 7e179793d70..4891527e7b2 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -4878,9 +4878,11 @@ Sema::BuildOverloadedArrowExpr(Scope *S, ExprArg BaseIn, SourceLocation OpLoc) {    OverloadCandidateSet CandidateSet;    const RecordType *BaseRecord = Base->getType()->getAs<RecordType>(); -  DeclContext::lookup_const_iterator Oper, OperEnd; -  for (llvm::tie(Oper, OperEnd) -         = BaseRecord->getDecl()->lookup(OpName); Oper != OperEnd; ++Oper) +  LookupResult R = LookupQualifiedName(BaseRecord->getDecl(), OpName,  +                                       LookupOrdinaryName); + +  for (LookupResult::iterator Oper = R.begin(), OperEnd = R.end(); +       Oper != OperEnd; ++Oper)      AddMethodCandidate(cast<CXXMethodDecl>(*Oper), Base, 0, 0, CandidateSet,                         /*SuppressUserConversions=*/false); @@ -4903,14 +4905,14 @@ Sema::BuildOverloadedArrowExpr(Scope *S, ExprArg BaseIn, SourceLocation OpLoc) {    case OR_Ambiguous:      Diag(OpLoc,  diag::err_ovl_ambiguous_oper) -      << "operator->" << Base->getSourceRange(); +      << "->" << Base->getSourceRange();      PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/true);      return ExprError();    case OR_Deleted:      Diag(OpLoc,  diag::err_ovl_deleted_oper)        << Best->Function->isDeleted() -      << "operator->" << Base->getSourceRange(); +      << "->" << Base->getSourceRange();      PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/true);      return ExprError();    } diff --git a/clang/test/SemaCXX/arrow-operator.cpp b/clang/test/SemaCXX/arrow-operator.cpp new file mode 100644 index 00000000000..9c46e96afc0 --- /dev/null +++ b/clang/test/SemaCXX/arrow-operator.cpp @@ -0,0 +1,22 @@ +// RUN: clang-cc -fsyntax-only -verify %s +struct T {  +  void f(); +}; + +struct A { +  T* operator->(); // expected-note{{candidate function}} +}; + +struct B { +  T* operator->(); // expected-note{{candidate function}} +}; + +struct C : A, B { +}; + +struct D : A { }; + +void f(C &c, D& d) { +  c->f(); // expected-error{{use of overloaded operator '->' is ambiguous}} +  d->f(); +}
\ No newline at end of file  | 

