@@ -17589,31 +17589,28 @@ class SequenceChecker : public ConstEvaluatedExprVisitor<SequenceChecker> {
17589
17589
return VisitExpr(CCE);
17590
17590
17591
17591
// In C++11, list initializations are sequenced.
17592
- SmallVector<SequenceTree::Seq, 32> Elts;
17593
- SequenceTree::Seq Parent = Region;
17594
- for (CXXConstructExpr::const_arg_iterator I = CCE->arg_begin(),
17595
- E = CCE->arg_end();
17596
- I != E; ++I) {
17597
- Region = Tree.allocate(Parent);
17598
- Elts.push_back(Region);
17599
- Visit(*I);
17600
- }
17601
-
17602
- // Forget that the initializers are sequenced.
17603
- Region = Parent;
17604
- for (unsigned I = 0; I < Elts.size(); ++I)
17605
- Tree.merge(Elts[I]);
17592
+ SequenceExpressionsInOrder({CCE->getArgs(), CCE->getNumArgs()});
17606
17593
}
17607
17594
17608
17595
void VisitInitListExpr(const InitListExpr *ILE) {
17609
17596
if (!SemaRef.getLangOpts().CPlusPlus11)
17610
17597
return VisitExpr(ILE);
17611
17598
17612
17599
// In C++11, list initializations are sequenced.
17600
+ SequenceExpressionsInOrder(ILE->inits());
17601
+ }
17602
+
17603
+ void VisitCXXParenListInitExpr(const CXXParenListInitExpr *PLIE) {
17604
+ // C++20 parenthesized list initializations are sequenced. See C++20
17605
+ // [decl.init.general]p16.5 and [decl.init.general]p16.6.2.2.
17606
+ SequenceExpressionsInOrder(PLIE->getInitExprs());
17607
+ }
17608
+
17609
+ private:
17610
+ void SequenceExpressionsInOrder(ArrayRef<const Expr *> ExpressionList) {
17613
17611
SmallVector<SequenceTree::Seq, 32> Elts;
17614
17612
SequenceTree::Seq Parent = Region;
17615
- for (unsigned I = 0; I < ILE->getNumInits(); ++I) {
17616
- const Expr *E = ILE->getInit(I);
17613
+ for (const Expr *E : ExpressionList) {
17617
17614
if (!E)
17618
17615
continue;
17619
17616
Region = Tree.allocate(Parent);
0 commit comments