diff options
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 32 | ||||
| -rw-r--r-- | clang/lib/Sema/TreeTransform.h | 7 |
2 files changed, 22 insertions, 17 deletions
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 172a07906da..ba9bcd65611 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -2390,20 +2390,24 @@ void Sema::LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, if (Operators.empty()) return; - for (LookupResult::iterator Op = Operators.begin(), OpEnd = Operators.end(); - Op != OpEnd; ++Op) { - NamedDecl *Found = (*Op)->getUnderlyingDecl(); - if (FunctionDecl *FD = dyn_cast<FunctionDecl>(Found)) { - if (IsAcceptableNonMemberOperatorCandidate(FD, T1, T2, Context)) - Functions.addDecl(*Op, Op.getAccess()); // FIXME: canonical FD - } else if (FunctionTemplateDecl *FunTmpl - = dyn_cast<FunctionTemplateDecl>(Found)) { - // FIXME: friend operators? - // FIXME: do we need to check IsAcceptableNonMemberOperatorCandidate, - // later? - if (!FunTmpl->getDeclContext()->isRecord()) - Functions.addDecl(*Op, Op.getAccess()); - } + for (auto I = Operators.begin(), E = Operators.end(); I != E; ++I) + addOverloadedOperatorToUnresolvedSet(Functions, I.getPair(), T1, T2); +} + +void Sema::addOverloadedOperatorToUnresolvedSet(UnresolvedSetImpl &Functions, + DeclAccessPair Op, + QualType T1, QualType T2) { + NamedDecl *Found = Op->getUnderlyingDecl(); + if (FunctionDecl *FD = dyn_cast<FunctionDecl>(Found)) { + if (IsAcceptableNonMemberOperatorCandidate(FD, T1, T2, Context)) + Functions.addDecl(Op, Op.getAccess()); // FIXME: canonical FD + } else if (FunctionTemplateDecl *FunTmpl + = dyn_cast<FunctionTemplateDecl>(Found)) { + // FIXME: friend operators? + // FIXME: do we need to check IsAcceptableNonMemberOperatorCandidate, + // later? + if (!FunTmpl->getDeclContext()->isRecord()) + Functions.addDecl(Op, Op.getAccess()); } } diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 27cf43fd742..4094f5a7166 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -9760,9 +9760,10 @@ TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { assert(ULE->requiresADL()); - // FIXME: Do we have to check - // IsAcceptableNonMemberOperatorCandidate for each of these? - Functions.append(ULE->decls_begin(), ULE->decls_end()); + for (auto I = ULE->decls_begin(), E = ULE->decls_end(); I != E; ++I) + SemaRef.addOverloadedOperatorToUnresolvedSet( + Functions, I.getPair(), First->getType(), + Second ? Second->getType() : QualType()); } else { // If we've resolved this to a particular non-member function, just call // that function. If we resolved it to a member function, |

