================ @@ -1230,11 +1230,26 @@ CodeGenFunction::EmitCXXForRangeStmt(const CXXForRangeStmt &S, JumpDest LoopExit = getJumpDestInCurrentScope("for.end"); LexicalScope ForScope(*this, S.getSourceRange()); + const DeclStmt *RangeDS = cast<DeclStmt>(S.getRangeStmt()); + const VarDecl *RangeVar = cast<VarDecl>(RangeDS->getSingleDecl()); + if (getLangOpts().CPlusPlus23) ---------------- yronglin wrote:
In `InitListChecker::FillInEmptyInitForField`, we will create a `CXXDefaultInitExpr` and fill in empty field `const A a& = A{};` for `for (auto &&x : B{}) {}` . Also there will have a `ExprWithCleanup` in `CXXDefaultInitExpr`. This is what I know about the difference in AST between the two cases, when I change the ExtendingDecl of `MaterializedTemporaryExpr`, it does not generate correct cleanups in CodeGen. https://github.com/llvm/llvm-project/pull/86960 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits