https://github.com/Machillka updated https://github.com/llvm/llvm-project/pull/219829
>From 2862b020e4b4729bac08ecfdf526ca9457292a47 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 | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 5 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..182420afe64dd 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,7 +1438,7 @@ TEST(TypeHints, ReturnTypeDeduction) { )cpp", ExpectedHint{"-> int", "ret1a"}, ExpectedHint{"-> int", "ret1b"}, ExpectedHint{"-> int &", "ret2"}, ExpectedHint{"-> void", "noreturn"}, - ExpectedHint{"-> int", "retConv"}); + ExpectedHint{"-> int", "retNoexcept"}, ExpectedHint{"-> int", "retConv"}); } TEST(TypeHints, DependentType) { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
