[clang-tools-extra] [clangd] Handle dependent call to function with explicit object parameter in InlayHintVisitor (PR #201264)

Nathan Ridge via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 2 21:26:01 PDT 2026


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 <zeratul976 at hotmail.com>
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.
 



More information about the cfe-commits mailing list