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