================
@@ -36,6 +36,111 @@ void extractNodesByIdTo(ArrayRef<BoundNodes> Matches, 
StringRef ID,
     Nodes.insert(Match.getNodeAs<Node>(ID));
 }
 
+// If `D` has a const-qualified overload with otherwise identical
+// ref-qualifiers, returns that overload.
+const CXXMethodDecl *findConstOverload(const CXXMethodDecl &D) {
+  assert(!D.isConst());
+
+  DeclContext::lookup_result lookup_result =
+      D.getParent()->lookup(D.getNameInfo().getName());
+  if (lookup_result.isSingleResult()) {
+    // No overload.
+    return nullptr;
+  }
+  for (const Decl *overload : lookup_result) {
+    const CXXMethodDecl *candidate = dyn_cast<CXXMethodDecl>(overload);
+    if (candidate && !candidate->isDeleted() && candidate->isConst() &&
+        candidate->getRefQualifier() == D.getRefQualifier()) {
----------------
legrosbuffle wrote:

Overloading would be allowed in this case, but I think having a `const` 
overload with the same *parameter* types is enough to say that the use is 
immutable (not that the case when the return value is non-const and the object 
might be modified through the return value is caught by `(C)`). I've added a 
test to make this explicit (`weird_overload()`).

That being said, your comment made me realize that we were not checking that 
the parameter types were the same. Done and added tests (`at(Tag1)`). Thanks :)

https://github.com/llvm/llvm-project/pull/94362
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to