https://github.com/danix800 updated https://github.com/llvm/llvm-project/pull/101031
>From 1e832ad408710d8a896d64e01a9fbf8b9c7a7819 Mon Sep 17 00:00:00 2001 From: dingfei <fd...@feysh.com> Date: Mon, 29 Jul 2024 23:18:20 +0800 Subject: [PATCH] [clang][ASTImporter] Remove trailing return testing on lambda proto Lambdas without trailing return could also have return type defined inside its body. This fixes crashes (infinite recursion) on lambda expr without parameters (without parentheses after []). --- clang/lib/AST/ASTImporter.cpp | 7 ++----- clang/unittests/AST/ASTImporterTest.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index da1981d8dd05f..b1c7c400861bc 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -3665,13 +3665,10 @@ bool ASTNodeImporter::hasReturnTypeDeclaredInside(FunctionDecl *D) { const auto *FromFPT = FromTy->getAs<FunctionProtoType>(); assert(FromFPT && "Must be called on FunctionProtoType"); - auto IsCXX11LambdaWithouTrailingReturn = [&]() { + auto IsCXX11Lambda = [&]() { if (Importer.FromContext.getLangOpts().CPlusPlus14) // C++14 or later return false; - if (FromFPT->hasTrailingReturn()) - return false; - if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) return cast<CXXRecordDecl>(MD->getDeclContext())->isLambda(); @@ -3679,7 +3676,7 @@ bool ASTNodeImporter::hasReturnTypeDeclaredInside(FunctionDecl *D) { }; QualType RetT = FromFPT->getReturnType(); - if (isa<AutoType>(RetT.getTypePtr()) || IsCXX11LambdaWithouTrailingReturn()) { + if (isa<AutoType>(RetT.getTypePtr()) || IsCXX11Lambda()) { FunctionDecl *Def = D->getDefinition(); IsTypeDeclaredInsideVisitor Visitor(Def ? Def : D); return Visitor.CheckType(RetT); diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index 57c5f79651824..d275a08dca895 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -6738,6 +6738,23 @@ TEST_P(ASTImporterOptionSpecificTestBase, EXPECT_TRUE(ToLambda); } +TEST_P(ASTImporterOptionSpecificTestBase, + ReturnTypeDeclaredInsideOfCXX11LambdaWithTrailingReturn) { + Decl *From, *To; + std::tie(From, To) = getImportedDecl( + R"( + void foo() { + (void) [] { + struct X {}; + return X(); + }; + } + )", + Lang_CXX11, "", Lang_CXX11, "foo"); // c++11 only + auto *ToLambda = FirstDeclMatcher<LambdaExpr>().match(To, lambdaExpr()); + EXPECT_TRUE(ToLambda); +} + TEST_P(ASTImporterOptionSpecificTestBase, LambdaInFunctionParam) { Decl *FromTU = getTuDecl( R"( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits