llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clangd Author: Nathan Ridge (HighCommander4) <details> <summary>Changes</summary> Fixes https://github.com/clangd/clangd/issues/2223 --- Full diff: https://github.com/llvm/llvm-project/pull/117296.diff 2 Files Affected: - (modified) clang-tools-extra/clangd/InlayHints.cpp (+9-4) - (modified) clang-tools-extra/clangd/unittests/InlayHintTests.cpp (+16) ``````````diff diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp index cd4f1931b3ce1d..006f7844d25882 100644 --- a/clang-tools-extra/clangd/InlayHints.cpp +++ b/clang-tools-extra/clangd/InlayHints.cpp @@ -599,10 +599,15 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> { bool VisitLambdaExpr(LambdaExpr *E) { FunctionDecl *D = E->getCallOperator(); - if (!E->hasExplicitResultType()) - addReturnTypeHint(D, E->hasExplicitParameters() - ? D->getFunctionTypeLoc().getRParenLoc() - : E->getIntroducerRange().getEnd()); + if (!E->hasExplicitResultType()) { + SourceLocation TypeHintLoc; + if (!E->hasExplicitParameters()) + TypeHintLoc = E->getIntroducerRange().getEnd(); + else if (auto FTL = D->getFunctionTypeLoc()) + TypeHintLoc = FTL.getRParenLoc(); + if (TypeHintLoc.isValid()) + addReturnTypeHint(D, TypeHintLoc); + } return true; } diff --git a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp index a5a349e93037ad..d779a24f532074 100644 --- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp +++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp @@ -1503,6 +1503,22 @@ TEST(TypeHints, Aliased) { EXPECT_THAT(hintsOfKind(AST, InlayHintKind::Type), IsEmpty()); } +TEST(TypeHints, CallingConvention) { + // Check that we don't crash for lambdas without a FunctionTypeLoc + // https://github.com/clangd/clangd/issues/2223 + std::string Code = R"cpp( + void test() { + []() __cdecl {}; + } + )cpp"; + TestTU TU = TestTU::withCode(Code); + TU.ExtraArgs.push_back("--target=x86_64-w64-mingw32"); + TU.PredefineMacros = true; // for the __cdecl + auto AST = TU.build(); + + EXPECT_THAT(hintsOfKind(AST, InlayHintKind::Type), IsEmpty()); +} + TEST(TypeHints, Decltype) { assertTypeHints(R"cpp( $a[[decltype(0)]] a; `````````` </details> https://github.com/llvm/llvm-project/pull/117296 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits