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.
+
+
+
+SWIG should parse lambda templates, but
+like
+ non-templated lambdas they aren't currently wrapped.
+
+