https://github.com/Machillka updated 
https://github.com/llvm/llvm-project/pull/219829

>From 06e84951d7449e7aa43010f5e34dae92f4b31b73 Mon Sep 17 00:00:00 2001
From: Machillka <[email protected]>
Date: Mon, 31 Aug 2026 01:28:34 +0800
Subject: [PATCH] [clangd] Place deduced return type hints after noexcept

Deduced return type hints could appear before the noexcept specifier for 
functions and lambdas. Place them after noexcept, where a trailing return type 
would be written.

Fixes clangd/clangd#2696
---
 clang-tools-extra/clangd/InlayHints.cpp            |  8 ++++----
 .../clangd/unittests/InlayHintTests.cpp            | 14 ++++++++++++++
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/clang-tools-extra/clangd/InlayHints.cpp 
b/clang-tools-extra/clangd/InlayHints.cpp
index 5bae4cc040210..e982c2c2f1974 100644
--- a/clang-tools-extra/clangd/InlayHints.cpp
+++ b/clang-tools-extra/clangd/InlayHints.cpp
@@ -504,7 +504,7 @@ class InlayHintVisitor : public 
RecursiveASTVisitor<InlayHintVisitor> {
             llvm::dyn_cast<FunctionProtoType>(D->getType().getTypePtr())) {
       if (!FPT->hasTrailingReturn()) {
         if (auto FTL = D->getFunctionTypeLoc())
-          addReturnTypeHint(D, FTL.getRParenLoc());
+          addReturnTypeHint(D, FTL.getLocalRangeEnd());
       }
     }
     if (Cfg.InlayHints.BlockEnd && D->isThisDeclarationADefinition()) {
@@ -601,10 +601,10 @@ class InlayHintVisitor : public 
RecursiveASTVisitor<InlayHintVisitor> {
     FunctionDecl *D = E->getCallOperator();
     if (!E->hasExplicitResultType()) {
       SourceLocation TypeHintLoc;
-      if (!E->hasExplicitParameters())
+      if (auto FTL = D->getFunctionTypeLoc())
+        TypeHintLoc = FTL.getLocalRangeEnd();
+      else if (!E->hasExplicitParameters())
         TypeHintLoc = E->getIntroducerRange().getEnd();
-      else if (auto FTL = D->getFunctionTypeLoc())
-        TypeHintLoc = FTL.getRParenLoc();
       if (TypeHintLoc.isValid())
         addReturnTypeHint(D, TypeHintLoc);
     }
diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp 
b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
index b90f44d102018..b46f324ffa9d8 100644
--- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -1318,6 +1318,17 @@ TEST(TypeHints, Lambda) {
   assertTypeHints("auto $L[[x]] = <:$ret[[:>]]{return 42;};",
                   ExpectedHint{": (lambda)", "L"},
                   ExpectedHint{"-> int", "ret"});
+
+  // The return type follows the noexcept specifier in a lambda declarator.
+  // https://github.com/clangd/clangd/issues/2696
+  assertTypeHints(R"cpp(
+    void f() {
+      []() $ret[[noexcept]] {};
+      [] $retNoParams[[noexcept]] {};
+    }
+  )cpp",
+                  ExpectedHint{"-> void", "ret"},
+                  ExpectedHint{"-> void", "retNoParams"});
 }
 
 // Structured bindings tests.
@@ -1412,6 +1423,8 @@ TEST(TypeHints, ReturnTypeDeduction) {
 
     auto f5($noreturn[[)]] {}
 
+    auto f6() $retNoexcept[[noexcept]] { return 42; }
+
     // `auto` conversion operator
     struct A {
       operator auto($retConv[[)]] { return 42; }
@@ -1425,6 +1438,7 @@ TEST(TypeHints, ReturnTypeDeduction) {
   )cpp",
       ExpectedHint{"-> int", "ret1a"}, ExpectedHint{"-> int", "ret1b"},
       ExpectedHint{"-> int &", "ret2"}, ExpectedHint{"-> void", "noreturn"},
+      ExpectedHint{"-> int", "retNoexcept"},
       ExpectedHint{"-> int", "retConv"});
 }
 

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

Reply via email to