diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index db386fef0661c..3b6b474886340 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -962,13 +962,16 @@ static bool shouldAddReversedEqEq(Sema &S, SourceLocation OpLoc, return true; } // Otherwise the search scope is the namespace scope of which F is a member. - for (NamedDecl *Op : EqFD->getEnclosingNamespaceContext()->lookup(NotEqOp)) { + DeclContext *EqDC = EqFD->getEnclosingNamespaceContext(); + for (NamedDecl *Op : EqDC->lookup(NotEqOp)) { auto *NotEqFD = Op->getAsFunction(); + DeclContext *NotEqDC = Op->getFriendObjectKind() + ? NotEqFD->getEnclosingNamespaceContext() + : Op->getLexicalDeclContext(); if (auto *UD = dyn_cast(Op)) NotEqFD = UD->getUnderlyingDecl()->getAsFunction(); if (FunctionsCorrespond(S.Context, EqFD, NotEqFD) && S.isVisible(NotEqFD) && - declaresSameEntity(cast(EqFD->getEnclosingNamespaceContext()), - cast(Op->getLexicalDeclContext()))) + declaresSameEntity(cast(EqDC), cast(NotEqDC))) return false; } return true; diff --git a/clang/test/CXX/over/over.match/over.match.funcs/over.match.oper/p3-2a.cpp b/clang/test/CXX/over/over.match/over.match.funcs/over.match.oper/p3-2a.cpp index d83a176ec07ee..3a33614a5cc34 100644 --- a/clang/test/CXX/over/over.match/over.match.funcs/over.match.oper/p3-2a.cpp +++ b/clang/test/CXX/over/over.match/over.match.funcs/over.match.oper/p3-2a.cpp @@ -324,6 +324,29 @@ bool x = X() == X(); // expected-warning {{ambiguous}} } } // namespace P2468R2 +namespace friend_opNE_GH{ +namespace opNENotFound { +struct S { + operator int(); + friend bool operator==(const S &, int); // expected-note {{reversed}} +}; +struct A : S {}; +struct B : S {}; +bool x = A{} == B{}; // expected-warning {{ambiguous}} +} // namespace opNENotFound + +namespace opNEFound { +struct S { + operator int(); + friend bool operator==(const S &, int); + friend bool operator!=(const S &, int); +}; +struct A : S {}; +struct B : S {}; +bool x = A{} == B{}; +} // namespace opNEFound +} // namespace friend_opNE_GH + namespace ADL_GH68901{ namespace test1 { namespace A {