[clang] Use the correct namespace for looking up matching operator!= (PR #68922)

Ilya Biryukov via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 19 08:42:53 PDT 2023


================
@@ -960,18 +960,13 @@ static bool shouldAddReversedEqEq(Sema &S, SourceLocation OpLoc,
     return true;
   }
   // Otherwise the search scope is the namespace scope of which F is a member.
-  LookupResult NonMembers(S, NotEqOp, OpLoc,
-                          Sema::LookupNameKind::LookupOperatorName);
-  S.LookupName(NonMembers,
-               S.getScopeForContext(EqFD->getEnclosingNamespaceContext()));
-  NonMembers.suppressAccessDiagnostics();
-  for (NamedDecl *Op : NonMembers) {
-    auto *FD = Op->getAsFunction();
-    if(auto* UD = dyn_cast<UsingShadowDecl>(Op))
-      FD = UD->getUnderlyingDecl()->getAsFunction();
-    if (FunctionsCorrespond(S.Context, EqFD, FD) &&
-        declaresSameEntity(cast<Decl>(EqFD->getDeclContext()),
-                           cast<Decl>(Op->getDeclContext())))
+  for (NamedDecl *Op : EqFD->getEnclosingNamespaceContext()->lookup(NotEqOp)) {
+    auto *NotEqFD = Op->getAsFunction();
----------------
ilya-biryukov wrote:

What about template functions? Something like:
```
namespace ns {
template <class T>
struct A {
};

template <class T> 
struct B : A<T> {
};

template <class T> bool operator == (B<T>, A<T>);
template <class T> bool operator != (B<T>, A<T>);
}

void test() {
    ns::A<int> a;
    ns::B<int> b;
    a == b;
}
```
https://gcc.godbolt.org/z/sc36a7f81


https://github.com/llvm/llvm-project/pull/68922


More information about the cfe-commits mailing list