https://github.com/danix800 updated https://github.com/llvm/llvm-project/pull/101031
>From 35caf00e707b4fb2472d1409e34be7d20e4eeec2 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 103235547f482..e1c94f9b6e68d 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -3713,13 +3713,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(); @@ -3727,7 +3724,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 57242ff49fe3b..986c3d2636aa5 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