[clang] [clang] Sequence C++20 Parenthesized List Init (PR #83476)

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Thu Feb 29 12:36:58 PST 2024


================
@@ -17626,6 +17626,25 @@ class SequenceChecker : public ConstEvaluatedExprVisitor<SequenceChecker> {
     for (unsigned I = 0; I < Elts.size(); ++I)
       Tree.merge(Elts[I]);
   }
+
+  void VisitCXXParenListInitExpr(const CXXParenListInitExpr *PLIE) {
+    // C++20 parenthesized list initializations are sequenced. See C++20
+    // [decl.init]p17.5 and [decl.init]p17.6.2.2
+    SmallVector<SequenceTree::Seq, 32> Elts;
+    SequenceTree::Seq Parent = Region;
+    for (const Expr *E : PLIE->getInitExprs()) {
+      if (!E)
+        continue;
+      Region = Tree.allocate(Parent);
+      Elts.push_back(Region);
+      Visit(E);
+    }
+
+    // Forget that the initializers are sequenced.
+    Region = Parent;
+    for (unsigned I = 0; I < Elts.size(); ++I)
+      Tree.merge(Elts[I]);
+  }
----------------
zygoloid wrote:

Is it feasible to factor out the common code between this and `VisitInitListExpr`? This looks nearly identical.

https://github.com/llvm/llvm-project/pull/83476


More information about the cfe-commits mailing list