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