Skip to content

Commit cacfb40

Browse files
rktdmjdrouhard
authored andcommitted
feat: add support for expansion statements (P1306)
Introduces support for `template for ( init; for-range-decl : expansion-init )` which is a compile-time way to expand (iterate over): - expansion expressions - anything destructurable via structured bindings - ranges with compile time size It was sufficient to simply re-use the existing rule for _for_range_loop_body for the part inside the parentheses, but add the required sequence of `template` followed by `for`
1 parent 3fd1c51 commit cacfb40

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

grammar.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,7 @@ module.exports = grammar(C, {
887887
$.co_return_statement,
888888
$.co_yield_statement,
889889
$.for_range_loop,
890+
$.expansion_statement,
890891
$.try_statement,
891892
$.throw_statement,
892893
),
@@ -896,6 +897,7 @@ module.exports = grammar(C, {
896897
$.co_return_statement,
897898
$.co_yield_statement,
898899
$.for_range_loop,
900+
$.expansion_statement,
899901
$.try_statement,
900902
$.throw_statement,
901903
),
@@ -1480,6 +1482,14 @@ module.exports = grammar(C, {
14801482
seq('template', $._splice_specialization_specifier),
14811483
)),
14821484

1485+
expansion_statement: $ => seq(
1486+
'template', 'for',
1487+
'(',
1488+
$._for_range_loop_body,
1489+
')',
1490+
field('body', $.statement),
1491+
),
1492+
14831493
operator_name: $ => prec(1, seq(
14841494
'operator',
14851495
choice(

test/corpus/reflection.txt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,3 +933,39 @@ struct C {
933933
(false)))))
934934
(primitive_type)
935935
(field_identifier)))))
936+
937+
================================================================================
938+
Expansion statements
939+
================================================================================
940+
941+
template for (auto const& c : {Containers...}) {}
942+
template for (constexpr int I : std::views::iota(0zu, sizeof...(Ts))) {}
943+
944+
--------------------------------------------------------------------------------
945+
946+
(translation_unit
947+
(expansion_statement
948+
(placeholder_type_specifier
949+
(auto))
950+
(type_qualifier)
951+
(reference_declarator
952+
(identifier))
953+
(initializer_list
954+
(parameter_pack_expansion
955+
(identifier)))
956+
(compound_statement))
957+
(expansion_statement
958+
(type_qualifier)
959+
(primitive_type)
960+
(identifier)
961+
(call_expression
962+
(qualified_identifier
963+
(namespace_identifier)
964+
(qualified_identifier
965+
(namespace_identifier)
966+
(identifier)))
967+
(argument_list
968+
(number_literal)
969+
(sizeof_expression
970+
(identifier))))
971+
(compound_statement)))

0 commit comments

Comments
 (0)