[llvm-branch-commits] [clang] [Clang] [C++26] Expansion Statements (Part 2: Parsing and Parser Tests) (PR #169681)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon May 4 08:44:53 PDT 2026
================
@@ -1895,8 +1937,56 @@ bool Parser::isForRangeIdentifier() {
return false;
}
-StmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc,
- LabelDecl *PrecedingLabel) {
+void Parser::ParseForRangeInitializerAfterColon(ForRangeInit &FRI,
+ ParsingDeclSpec *VarDeclSpec) {
+ // Use an immediate function context if this is the initializer for a
+ // constexpr variable in an expansion statement.
+ auto Ctx = Sema::ExpressionEvaluationContext::PotentiallyEvaluated;
+ if (FRI.ExpansionStmt && VarDeclSpec && VarDeclSpec->hasConstexprSpecifier())
+ Ctx = Sema::ExpressionEvaluationContext::ImmediateFunctionContext;
+
+ EnterExpressionEvaluationContext InitContext(
+ Actions, Ctx,
+ /*LambdaContextDecl=*/nullptr,
+ Sema::ExpressionEvaluationContextRecord::EK_Other,
+ getLangOpts().CPlusPlus23);
+
+ // P2718R0 - Lifetime extension in range-based for loops.
+ if (getLangOpts().CPlusPlus23) {
+ auto &LastRecord = Actions.currentEvaluationContext();
+ LastRecord.InLifetimeExtendingContext = true;
+ LastRecord.RebuildDefaultArgOrDefaultInit = true;
+ }
+
+ if (FRI.ExpansionStmt) {
+ // The expansion-initializer is not in a dependent context and should
+ // thus be parsed in the parent context of the expansion statement.
+ assert(Actions.CurContext->isExpansionStmt());
+ Sema::ContextRAII CtxGuard(Actions, Actions.CurContext->getParent(),
+ /*NewThis=*/false);
----------------
Sirraide wrote:
We can use it here too sure; the main point of that helper is to _conditionally_ enter the parent context only if we’re parsing an expansion statement, so it’s mainly used in code that is shared with regular (range-based) for loops; that isn’t the case here, but we can still use it here too I suppose
https://github.com/llvm/llvm-project/pull/169681
More information about the llvm-branch-commits
mailing list