Skip to content

Commit 4373ae7

Browse files
committed
c++23: support additional lambda expression syntax (P1102R2)
P1102R2 relaxed lambda syntax so that () (empty parameter list) is optional in more cases.
1 parent a352ed8 commit 4373ae7

File tree

2 files changed

+70
-5
lines changed

2 files changed

+70
-5
lines changed

grammar.js

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ module.exports = grammar(C, {
8383
[$.expression, $._lambda_capture],
8484
[$.expression, $.structured_binding_declarator, $._lambda_capture_identifier],
8585
[$.structured_binding_declarator, $._lambda_capture_identifier],
86+
[$.lambda_declarator],
8687
[$.parameter_list, $.argument_list],
8788
[$.type_specifier, $.call_expression],
8889
[$._declaration_specifiers, $._constructor_specifiers],
@@ -1085,13 +1086,46 @@ module.exports = grammar(C, {
10851086
field('requirements', $.requirement_seq),
10861087
),
10871088

1089+
lambda_declarator: $ => choice(
1090+
// main declarator form, includes parameter list
1091+
seq(
1092+
field('parameters', $.parameter_list),
1093+
repeat($.attribute_declaration),
1094+
optional($.type_qualifier),
1095+
optional($._function_exception_specification),
1096+
repeat($.attribute_declaration),
1097+
optional($.trailing_return_type),
1098+
optional($.requires_clause),
1099+
),
1100+
1101+
// forms supporting omitted parameter list
1102+
repeat1($.attribute_declaration),
1103+
seq(
1104+
repeat($.attribute_declaration),
1105+
$.trailing_return_type,
1106+
),
1107+
seq(
1108+
repeat($.attribute_declaration),
1109+
$._function_exception_specification,
1110+
repeat($.attribute_declaration),
1111+
optional($.trailing_return_type),
1112+
),
1113+
seq(
1114+
repeat($.attribute_declaration),
1115+
$.type_qualifier,
1116+
optional($._function_exception_specification),
1117+
repeat($.attribute_declaration),
1118+
optional($.trailing_return_type),
1119+
),
1120+
),
1121+
10881122
lambda_expression: $ => seq(
10891123
field('captures', $.lambda_capture_specifier),
10901124
optional(seq(
10911125
field('template_parameters', $.template_parameter_list),
10921126
optional(field('constraint', $.requires_clause)),
10931127
)),
1094-
optional(field('declarator', $.abstract_function_declarator)),
1128+
optional(field('declarator', $.lambda_declarator)),
10951129
field('body', $.compound_statement),
10961130
),
10971131

test/corpus/expressions.txt

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,10 @@ auto f = [&arg, &...etc = etc] {};
302302

303303
auto f = [=, *this, &args...] {};
304304

305+
auto f = [] -> int {};
306+
307+
auto f = [s = S{}] mutable {};
308+
305309
--------------------------------------------------------------------------------
306310

307311
(translation_unit
@@ -313,7 +317,7 @@ auto f = [=, *this, &args...] {};
313317
(lambda_expression
314318
(lambda_capture_specifier
315319
(lambda_default_capture))
316-
(abstract_function_declarator
320+
(lambda_declarator
317321
(parameter_list
318322
(parameter_declaration
319323
(primitive_type)
@@ -333,7 +337,7 @@ auto f = [=, *this, &args...] {};
333337
(lambda_capture_specifier
334338
(identifier)
335339
(identifier))
336-
(abstract_function_declarator
340+
(lambda_declarator
337341
(parameter_list
338342
(parameter_declaration
339343
(primitive_type)
@@ -361,7 +365,7 @@ auto f = [=, *this, &args...] {};
361365
(template_parameter_list
362366
(type_parameter_declaration
363367
(type_identifier)))
364-
(abstract_function_declarator
368+
(lambda_declarator
365369
(parameter_list))
366370
(compound_statement
367371
(return_statement
@@ -408,7 +412,7 @@ auto f = [=, *this, &args...] {};
408412
(type_identifier)))))
409413
(argument_list
410414
(identifier)))))
411-
(abstract_function_declarator
415+
(lambda_declarator
412416
(parameter_list
413417
(parameter_declaration
414418
(placeholder_type_specifier
@@ -468,6 +472,33 @@ auto f = [=, *this, &args...] {};
468472
(this)
469473
(parameter_pack_expansion
470474
(identifier)))
475+
(compound_statement))))
476+
(declaration
477+
(placeholder_type_specifier
478+
(auto))
479+
(init_declarator
480+
(identifier)
481+
(lambda_expression
482+
(lambda_capture_specifier)
483+
(lambda_declarator
484+
(trailing_return_type
485+
(type_descriptor
486+
(primitive_type))))
487+
(compound_statement))))
488+
(declaration
489+
(placeholder_type_specifier
490+
(auto))
491+
(init_declarator
492+
(identifier)
493+
(lambda_expression
494+
(lambda_capture_specifier
495+
(lambda_capture_initializer
496+
(identifier)
497+
(compound_literal_expression
498+
(type_identifier)
499+
(initializer_list))))
500+
(lambda_declarator
501+
(type_qualifier))
471502
(compound_statement)))))
472503

473504
================================================================================

0 commit comments

Comments
 (0)