[llvm-branch-commits] [clang] [Clang] [C++26] Expansion Statements (Part 6: Destructuring Expansion Statements) (PR #169685)
Corentin Jabot via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Jun 1 04:58:39 PDT 2026
================
@@ -384,8 +429,59 @@ StmtResult Sema::BuildNonEnumeratingCXXExpansionStmtPattern(
Data.IterDecl, LParenLoc, ColonLoc, RParenLoc);
}
- Diag(ESD->getLocation(), diag::err_expansion_statements_todo);
- return StmtError();
+ // If not, try destructuring.
+ StmtResult DecompDeclStmt = BuildDestructuringDecompositionDecl(
+ *this, ExpansionInitializer, ColonLoc, ExpansionVar->isConstexpr(),
+ LifetimeExtendTemps);
+ if (DecompDeclStmt.isInvalid()) {
+ ActOnInitializerError(ExpansionVar);
+ return StmtError();
+ }
+
+ auto *DS = DecompDeclStmt.getAs<DeclStmt>();
+ auto *DD = cast<DecompositionDecl>(DS->getSingleDecl());
+ if (DD->isInvalidDecl())
+ return StmtError();
+
+ // Synthesise an InitListExpr to store the bindings; this essentially lets us
+ // desugar the expansion of a destructuring expansion statement to that of an
+ // enumerating expansion statement.
+ SmallVector<Expr *> Bindings;
+ for (BindingDecl *BD : DD->bindings()) {
+ Expr *Element = BuildDeclRefExpr(BD, BD->getType().getNonReferenceType(),
+ VK_LValue, ColonLoc);
+
+ // CWG 3149: If the expansion-initializer is an lvalue, then vi is ui;
+ // otherwise, vi is static_cast<decltype(ui)&&>(ui).
+ if (!ExpansionInitializer->isLValue()) {
+ QualType Ty =
+ BuildReferenceType(getDecltypeForExpr(Element), /*LValueRef=*/false,
+ ColonLoc, /*Entity=*/DeclarationName());
+ TypeSourceInfo *TSI = Context.getTrivialTypeSourceInfo(Ty);
+ ExprResult Cast = BuildCXXNamedCast(
+ ColonLoc, tok::kw_static_cast, TSI, Element,
+ SourceRange(ColonLoc, ColonLoc), SourceRange(ColonLoc, ColonLoc));
+ assert(!Cast.isInvalid() && "cast to rvalue reference type failed?");
+ Element = Cast.get();
----------------
cor3ntin wrote:
Do we actually have to do all that, or can we create `BuildDeclRefExpr` with an rvalue?
https://github.com/llvm/llvm-project/pull/169685
More information about the llvm-branch-commits
mailing list