https://github.com/HighCommander4 created 
https://github.com/llvm/llvm-project/pull/201264

Dependent calls do not yet have the implicit object argument preprended to the 
CallExpr's argument list, so the first argument should not be expected to be 
present and dropped in this case.

Fixes https://github.com/llvm/llvm-project/issues/198588

>From 2a0c0aad3892c0cf3f4f625e740b255f61fe0db5 Mon Sep 17 00:00:00 2001
From: Nathan Ridge <[email protected]>
Date: Wed, 3 Jun 2026 00:23:00 -0400
Subject: [PATCH] [clangd] Handle dependent call to function with explicit
 object parameter in InlayHintVisitor

Dependent calls do not yet have the implicit object argument
preprended to the CallExpr's argument list, so the first
argument should not be expected to be present and dropped
in this case.
---
 clang-tools-extra/clangd/InlayHints.cpp           |  3 ++-
 .../clangd/unittests/InlayHintTests.cpp           | 15 +++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/clang-tools-extra/clangd/InlayHints.cpp 
b/clang-tools-extra/clangd/InlayHints.cpp
index 951177e3546f2..5bae4cc040210 100644
--- a/clang-tools-extra/clangd/InlayHints.cpp
+++ b/clang-tools-extra/clangd/InlayHints.cpp
@@ -492,7 +492,8 @@ class InlayHintVisitor : public 
RecursiveASTVisitor<InlayHintVisitor> {
     // either.
     if (const CXXMethodDecl *Method =
             dyn_cast_or_null<CXXMethodDecl>(Callee.Decl))
-      if (IsFunctor || Method->hasCXXExplicitFunctionObjectParameter())
+      if (IsFunctor || (!E->isTypeDependent() &&
+                        Method->hasCXXExplicitFunctionObjectParameter()))
         Args = Args.drop_front(1);
     processCall(Callee, E->getRParenLoc(), Args);
     return true;
diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp 
b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
index 5552aa178a354..b90f44d102018 100644
--- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -890,6 +890,21 @@ TEST(ParameterHints, DeducingThis) {
                        ExpectedHint{"Param: ", "3"}, ExpectedHint{"C: ", "4"});
 }
 
+TEST(ParameterHints, DependentDeducingThis) {
+  assertParameterHints(R"cpp(
+   template <typename T>
+   struct S {
+      void f1(this S& obj);
+      void f2(this S& obj, int x, int y);
+      void g(S s) {
+        s.f1();  // no crash
+        s.f2($x[[42]], $y[[43]]);
+      }
+    };
+  )cpp",
+                       ExpectedHint{"x: ", "x"}, ExpectedHint{"y: ", "y"});
+}
+
 TEST(ParameterHints, Macros) {
   // Handling of macros depends on where the call's argument list comes from.
 

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to