@@ -144,6 +144,12 @@ struct primary_expression_node
144144 std::unique_ptr<literal_node>
145145 > expr;
146146
147+ auto is_expression_list () const
148+ -> bool;
149+
150+ auto get_expression_list () const
151+ -> expression_list_node const *;
152+
147153 auto template_args_count () -> int;
148154 auto get_token () const -> token const *;
149155 auto position () const -> source_position;
@@ -188,6 +194,12 @@ struct prefix_expression_node
188194 std::vector<token const *> ops;
189195 std::unique_ptr<postfix_expression_node> expr;
190196
197+ auto is_expression_list () const
198+ -> bool;
199+
200+ auto get_expression_list () const
201+ -> expression_list_node const *;
202+
191203 auto get_postfix_expression_node () const
192204 -> postfix_expression_node *
193205 {
@@ -217,6 +229,23 @@ struct binary_expression_node
217229 };
218230 std::vector<term> terms;
219231
232+ // API
233+ //
234+ auto is_expression_list () const
235+ -> bool
236+ {
237+ return terms.empty () && expr->is_expression_list ();
238+ }
239+
240+ auto get_expression_list () const
241+ -> expression_list_node const *
242+ {
243+ if (is_expression_list ()) {
244+ return expr->get_expression_list ();
245+ }
246+ return {};
247+ }
248+
220249 // Get left-hand postfix-expression
221250 auto get_postfix_expression_node () const
222251 -> postfix_expression_node *
@@ -325,6 +354,21 @@ struct expression_node
325354
326355 // API
327356 //
357+ auto is_expression_list () const
358+ -> bool
359+ {
360+ return expr->is_expression_list ();
361+ }
362+
363+ auto get_expression_list () const
364+ -> expression_list_node const *
365+ {
366+ if (is_expression_list ()) {
367+ return expr->get_expression_list ();
368+ }
369+ return {};
370+ }
371+
328372 auto get_lhs_rhs_if_simple_assignment () const
329373 -> assignment_expression_lhs_rhs;
330374
@@ -408,6 +452,21 @@ struct expression_list_node
408452 }
409453};
410454
455+ auto primary_expression_node::is_expression_list () const
456+ -> bool
457+ {
458+ return expr.index () == expression_list;
459+ }
460+
461+ auto primary_expression_node::get_expression_list () const
462+ -> expression_list_node const *
463+ {
464+ if (is_expression_list ()) {
465+ return std::get<expression_list>(expr).get ();
466+ }
467+ return {};
468+ }
469+
411470
412471struct expression_statement_node
413472{
@@ -483,6 +542,21 @@ struct postfix_expression_node
483542
484543 // API
485544 //
545+ auto is_expression_list () const
546+ -> bool
547+ {
548+ return ops.empty () && expr->is_expression_list ();
549+ }
550+
551+ auto get_expression_list () const
552+ -> expression_list_node const *
553+ {
554+ if (is_expression_list ()) {
555+ return expr->get_expression_list ();
556+ }
557+ return {};
558+ }
559+
486560 auto get_first_token_ignoring_this () const
487561 -> token const *;
488562
@@ -506,6 +580,21 @@ struct postfix_expression_node
506580 auto visit (auto & v, int depth) -> void;
507581};
508582
583+ auto prefix_expression_node::is_expression_list () const
584+ -> bool
585+ {
586+ return ops.empty () && expr->is_expression_list ();
587+ }
588+
589+ auto prefix_expression_node::get_expression_list () const
590+ -> expression_list_node const *
591+ {
592+ if (is_expression_list ()) {
593+ return expr->get_expression_list ();
594+ }
595+ return {};
596+ }
597+
509598auto prefix_expression_node::is_result_a_temporary_variable () const -> bool {
510599 if (ops.empty ()) {
511600 return expr->is_result_a_temporary_variable ();
@@ -833,6 +922,21 @@ struct is_as_expression_node
833922 };
834923 std::vector<term> ops;
835924
925+ auto is_expression_list () const
926+ -> bool
927+ {
928+ return ops.empty () && expr->is_expression_list ();
929+ }
930+
931+ auto get_expression_list () const
932+ -> expression_list_node const *
933+ {
934+ if (is_expression_list ()) {
935+ return expr->get_expression_list ();
936+ }
937+ return {};
938+ }
939+
836940 auto get_postfix_expression_node () const
837941 -> postfix_expression_node *
838942 {
0 commit comments