Преглед изворни кода

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`
pull/333/head
rktdm пре 10 месеци
родитељ
комит
5bbbb2d697
2 измењених фајлова са 46 додато и 0 уклоњено
  1. +10
    -0
      grammar.js
  2. +36
    -0
      test/corpus/reflection.txt

+ 10
- 0
grammar.js Прегледај датотеку

@ -887,6 +887,7 @@ module.exports = grammar(C, {
$.co_return_statement,
$.co_yield_statement,
$.for_range_loop,
$.expansion_statement,
$.try_statement,
$.throw_statement,
),
@ -896,6 +897,7 @@ module.exports = grammar(C, {
$.co_return_statement,
$.co_yield_statement,
$.for_range_loop,
$.expansion_statement,
$.try_statement,
$.throw_statement,
),
@ -1480,6 +1482,14 @@ module.exports = grammar(C, {
seq('template', $._splice_specialization_specifier),
)),
expansion_statement: $ => seq(
'template', 'for',
'(',
$._for_range_loop_body,
')',
field('body', $.statement),
),
operator_name: $ => prec(1, seq(
'operator',
choice(

+ 36
- 0
test/corpus/reflection.txt Прегледај датотеку

@ -933,3 +933,39 @@ struct C {
(false)))))
(primitive_type)
(field_identifier)))))
================================================================================
Expansion statements
================================================================================
template for (auto const& c : {Containers...}) {}
template for (constexpr int I : std::views::iota(0zu, sizeof...(Ts))) {}
--------------------------------------------------------------------------------
(translation_unit
(expansion_statement
(placeholder_type_specifier
(auto))
(type_qualifier)
(reference_declarator
(identifier))
(initializer_list
(parameter_pack_expansion
(identifier)))
(compound_statement))
(expansion_statement
(type_qualifier)
(primitive_type)
(identifier)
(call_expression
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(identifier)))
(argument_list
(number_literal)
(sizeof_expression
(identifier))))
(compound_statement)))

Loading…
Откажи
Сачувај