[clang] [clang][ASTImporter] Fix typos in trailing return testing on lambda p… (PR #101031)
Ding Fei via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 30 19:33:20 PDT 2024
https://github.com/danix800 updated https://github.com/llvm/llvm-project/pull/101031
>From 35caf00e707b4fb2472d1409e34be7d20e4eeec2 Mon Sep 17 00:00:00 2001
From: dingfei <fding at 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"(
More information about the cfe-commits
mailing list