From 61928bd882f3b53ebd88862bc9bb40f2bb33ca0d Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Sat, 7 Dec 2019 21:08:11 -0700 Subject: [PATCH 1/4] Add support for C++20 "templated" lambdas Such as `auto lambda = [](std::vector t){};` --- Source/CParse/parser.y | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index be5159a62..a8456826b 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -1713,7 +1713,7 @@ static String *add_qualifier_to_declarator(SwigType *type, SwigType *qualifier) %type type_specifier primitive_type_list ; %type fname stringtype; %type featattr; -%type lambda_introducer lambda_body; +%type lambda_introducer lambda_body lambda_template; %type lambda_tail; %type virt_specifier_seq virt_specifier_seq_opt; @@ -3420,17 +3420,17 @@ cpp_alternate_rettype : primitive_type { $$ = $1; } auto myFunc = [](int x, int y) throw() -> int { return x+y; }; auto six = [](int x, int y) { return x+y; }(4, 2); ------------------------------------------------------------ */ -cpp_lambda_decl : storage_class AUTO idcolon EQUAL lambda_introducer LPAREN parms RPAREN cpp_const lambda_body lambda_tail { +cpp_lambda_decl : storage_class AUTO idcolon EQUAL lambda_introducer lambda_template LPAREN parms RPAREN cpp_const lambda_body lambda_tail { $$ = new_node("lambda"); Setattr($$,"name",$3); add_symbols($$); } - | storage_class AUTO idcolon EQUAL lambda_introducer LPAREN parms RPAREN cpp_const ARROW type lambda_body lambda_tail { + | storage_class AUTO idcolon EQUAL lambda_introducer lambda_template LPAREN parms RPAREN cpp_const ARROW type lambda_body lambda_tail { $$ = new_node("lambda"); Setattr($$,"name",$3); add_symbols($$); } - | storage_class AUTO idcolon EQUAL lambda_introducer lambda_body lambda_tail { + | storage_class AUTO idcolon EQUAL lambda_introducer lambda_template lambda_body lambda_tail { $$ = new_node("lambda"); Setattr($$,"name",$3); add_symbols($$); @@ -3442,7 +3442,12 @@ lambda_introducer : LBRACKET { $$ = 0; } ; - +lambda_template : LESSTHAN { + skip_balanced('<','>'); + $$ = 0; + } + | empty { $$ = 0; } + ; lambda_body : LBRACE { skip_balanced('{','}'); $$ = 0; From e31de2aebba03425915dd9f399c60e9ec85a8ef4 Mon Sep 17 00:00:00 2001 From: Olly Betts Date: Wed, 27 Jul 2022 09:30:30 +1200 Subject: [PATCH 2/4] Tidy up indentation --- Source/CParse/parser.y | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index a8456826b..816264de6 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -3442,12 +3442,14 @@ lambda_introducer : LBRACKET { $$ = 0; } ; + lambda_template : LESSTHAN { skip_balanced('<','>'); $$ = 0; - } - | empty { $$ = 0; } - ; + } + | empty { $$ = 0; } + ; + lambda_body : LBRACE { skip_balanced('{','}'); $$ = 0; From 88f227b5da97bd30ab165a000530bb7468f96424 Mon Sep 17 00:00:00 2001 From: Olly Betts Date: Wed, 27 Jul 2022 09:30:39 +1200 Subject: [PATCH 3/4] Add testcase --- Examples/test-suite/common.mk | 1 + Examples/test-suite/cpp20_lambda_template.i | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 Examples/test-suite/cpp20_lambda_template.i diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index 838ea5d2a..6ca3aef22 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -649,6 +649,7 @@ CPP17_TEST_BROKEN = \ # C++20 test cases. CPP20_TEST_CASES += \ + cpp20_lambda_template \ cpp20_spaceship_operator \ # Broken C++20 test cases. diff --git a/Examples/test-suite/cpp20_lambda_template.i b/Examples/test-suite/cpp20_lambda_template.i new file mode 100644 index 000000000..948364f42 --- /dev/null +++ b/Examples/test-suite/cpp20_lambda_template.i @@ -0,0 +1,12 @@ +%module cpp20_lambda_template + +// We just want to test that SWIG doesn't choke parsing this so suppress: +// Warning 340: Lambda expressions and closures are not fully supported yet. +%warnfilter(WARN_CPP11_LAMBDA); + +%include + +%inline %{ +#include +auto templated_lambda = [](std::vector t){}; +%} From 8182740b8e6f89c276d19b767853f89b74a3c569 Mon Sep 17 00:00:00 2001 From: Olly Betts Date: Wed, 27 Jul 2022 09:34:16 +1200 Subject: [PATCH 4/4] Add documentation --- CHANGES.current | 3 +++ Doc/Manual/CPlusPlus20.html | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/CHANGES.current b/CHANGES.current index 38c0b7011..fbf85ba3e 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -7,6 +7,9 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 4.1.0 (in progress) =========================== +2022-07-27: ZackerySpytz, olly + #1678 Support parsing C++20 templated lambdas. + 2022-07-27: ZackerySpytz, olly #1622 Add support for the C++20 spaceship operator (<=>). diff --git a/Doc/Manual/CPlusPlus20.html b/Doc/Manual/CPlusPlus20.html index 8db84bfd5..0f29a03b8 100644 --- a/Doc/Manual/CPlusPlus20.html +++ b/Doc/Manual/CPlusPlus20.html @@ -50,6 +50,14 @@ or attempts to automatically map it to a three-way comparison operator in any target languages that have one.

+

10.2.2 Lambda templates

+ +

+SWIG should parse lambda templates, but +like + non-templated lambdas they aren't currently wrapped. +

+

10.3 Standard library changes