[clang-tools-extra] 5518bb2 - [clangd] Check getFunctionTypeLoc() for validity in InlayHintVisitor (#117296)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 22 00:11:10 PST 2024
Author: Nathan Ridge
Date: 2024-11-22T03:11:07-05:00
New Revision: 5518bb215b51cc339c3ecac064032f6791ae6476
URL: https://github.com/llvm/llvm-project/commit/5518bb215b51cc339c3ecac064032f6791ae6476
DIFF: https://github.com/llvm/llvm-project/commit/5518bb215b51cc339c3ecac064032f6791ae6476.diff
LOG: [clangd] Check getFunctionTypeLoc() for validity in InlayHintVisitor (#117296)
Fixes https://github.com/clangd/clangd/issues/2223
Added:
Modified:
clang-tools-extra/clangd/InlayHints.cpp
clang-tools-extra/clangd/unittests/InlayHintTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/InlayHints.cpp b/clang-tools-extra/clangd/InlayHints.cpp
index c4053fced81d6f..fefffeb4efc1a2 100644
--- a/clang-tools-extra/clangd/InlayHints.cpp
+++ b/clang-tools-extra/clangd/InlayHints.cpp
@@ -626,10 +626,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 73dd273d6c39d4..77d78b8777fe30 100644
--- a/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
+++ b/clang-tools-extra/clangd/unittests/InlayHintTests.cpp
@@ -1576,6 +1576,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;
More information about the cfe-commits
mailing list