@@ -17615,31 +17615,28 @@ class SequenceChecker : public ConstEvaluatedExprVisitor<SequenceChecker> {
17615
17615
return VisitExpr(CCE);
17616
17616
17617
17617
// In C++11, list initializations are sequenced.
17618
- SmallVector<SequenceTree::Seq, 32> Elts;
17619
- SequenceTree::Seq Parent = Region;
17620
- for (CXXConstructExpr::const_arg_iterator I = CCE->arg_begin(),
17621
- E = CCE->arg_end();
17622
- I != E; ++I) {
17623
- Region = Tree.allocate(Parent);
17624
- Elts.push_back(Region);
17625
- Visit(*I);
17626
- }
17627
-
17628
- // Forget that the initializers are sequenced.
17629
- Region = Parent;
17630
- for (unsigned I = 0; I < Elts.size(); ++I)
17631
- Tree.merge(Elts[I]);
17618
+ SequenceExpressionsInOrder({CCE->getArgs(), CCE->getNumArgs()});
17632
17619
}
17633
17620
17634
17621
void VisitInitListExpr(const InitListExpr *ILE) {
17635
17622
if (!SemaRef.getLangOpts().CPlusPlus11)
17636
17623
return VisitExpr(ILE);
17637
17624
17638
17625
// In C++11, list initializations are sequenced.
17626
+ SequenceExpressionsInOrder(ILE->inits());
17627
+ }
17628
+
17629
+ void VisitCXXParenListInitExpr(const CXXParenListInitExpr *PLIE) {
17630
+ // C++20 parenthesized list initializations are sequenced. See C++20
17631
+ // [decl.init.general]p16.5 and [decl.init.general]p16.6.2.2.
17632
+ SequenceExpressionsInOrder(PLIE->getInitExprs());
17633
+ }
17634
+
17635
+ private:
17636
+ void SequenceExpressionsInOrder(ArrayRef<const Expr *> ExpressionList) {
17639
17637
SmallVector<SequenceTree::Seq, 32> Elts;
17640
17638
SequenceTree::Seq Parent = Region;
17641
- for (unsigned I = 0; I < ILE->getNumInits(); ++I) {
17642
- const Expr *E = ILE->getInit(I);
17639
+ for (const Expr *E : ExpressionList) {
17643
17640
if (!E)
17644
17641
continue;
17645
17642
Region = Tree.allocate(Parent);
0 commit comments