Author: Corentin Jabot Date: 2023-05-01T23:21:14+02:00 New Revision: 771ad1691ac3057df2220dd327d7cdc73ef6c6f5
URL: https://github.com/llvm/llvm-project/commit/771ad1691ac3057df2220dd327d7cdc73ef6c6f5 DIFF: https://github.com/llvm/llvm-project/commit/771ad1691ac3057df2220dd327d7cdc73ef6c6f5.diff LOG: [Clang] Fix a crash when recursively callig a default member initializer. This fixes a regression introduced by ca61961380, that would lead to a segfault due to stack exhaustion when recursively calling a default member initializer. Fixes #60082 I'm not able to get clang to emit a stack exhaustion warning, which it seems like it should be able to. Reviewed By: shafik Differential Revision: https://reviews.llvm.org/D142401 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaExpr.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index a3ee06ba1c22..34636faa36bf 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -313,8 +313,8 @@ Bug Fixes in This Version not a type concept. - Fix crash when a doc comment contains a line splicing. (`#62054 <https://github.com/llvm/llvm-project/issues/62054>`_) -- Work around with a clang coverage crash which happens when visiting - expressions/statements with invalid source locations in non-assert builds. +- Work around with a clang coverage crash which happens when visiting + expressions/statements with invalid source locations in non-assert builds. Assert builds may still see assertions triggered from this. - Fix a failed assertion due to an invalid source location when trying to form a coverage report for an unresolved constructor expression. @@ -335,6 +335,8 @@ Bug Fixes in This Version - Fix crash when attempting to perform parenthesized initialization of an aggregate with a base class with only non-public constructors. (`#62296 <https://github.com/llvm/llvm-project/issues/62296>`_) +- Fix a stack overflow issue when evaluating ``consteval`` default arguments. + (`#60082` <https://github.com/llvm/llvm-project/issues/60082>`_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 5450b4748997..4edaf6970a2d 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -5926,7 +5926,9 @@ bool Sema::CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, Param); ExprEvalContexts.back().IsCurrentlyCheckingDefaultArgumentOrInitializer = SkipImmediateInvocations; - MarkDeclarationsReferencedInExpr(Init, /*SkipLocalVariables*/ true); + runWithSufficientStackSpace(CallLoc, [&] { + MarkDeclarationsReferencedInExpr(Init, /*SkipLocalVariables=*/true); + }); return false; } @@ -6036,8 +6038,11 @@ ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc, ExprEvalContexts.back().DelayedDefaultInitializationContext = { CallLoc, Param, CurContext}; EnsureImmediateInvocationInDefaultArgs Immediate(*this); - ExprResult Res = Immediate.TransformInitializer(Param->getInit(), - /*NotCopy=*/false); + ExprResult Res; + runWithSufficientStackSpace(CallLoc, [&] { + Res = Immediate.TransformInitializer(Param->getInit(), + /*NotCopy=*/false); + }); if (Res.isInvalid()) return ExprError(); Res = ConvertParamDefaultArgument(Param, Res.get(), @@ -6117,10 +6122,11 @@ ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) { NestedDefaultChecking; EnsureImmediateInvocationInDefaultArgs Immediate(*this); - - ExprResult Res = - Immediate.TransformInitializer(Field->getInClassInitializer(), - /*CXXDirectInit=*/false); + ExprResult Res; + runWithSufficientStackSpace(Loc, [&] { + Res = Immediate.TransformInitializer(Field->getInClassInitializer(), + /*CXXDirectInit=*/false); + }); if (!Res.isInvalid()) Res = ConvertMemberDefaultInitExpression(Field, Res.get(), Loc); if (Res.isInvalid()) { @@ -6133,7 +6139,9 @@ ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) { if (Field->getInClassInitializer()) { Expr *E = Init ? Init : Field->getInClassInitializer(); if (!NestedDefaultChecking) - MarkDeclarationsReferencedInExpr(E, /*SkipLocalVariables=*/false); + runWithSufficientStackSpace(Loc, [&] { + MarkDeclarationsReferencedInExpr(E, /*SkipLocalVariables=*/false); + }); // C++11 [class.base.init]p7: // The initialization of each base and member constitutes a // full-expression. @@ -18545,7 +18553,9 @@ void Sema::MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Func)) { for (CXXCtorInitializer *Init : Constructor->inits()) { if (Init->isInClassMemberInitializer()) - MarkDeclarationsReferencedInExpr(Init->getInit()); + runWithSufficientStackSpace(Init->getSourceLocation(), [&]() { + MarkDeclarationsReferencedInExpr(Init->getInit()); + }); } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits