Add lambda functions to the symbol tables and add ability to suppress lambda warnings.
This commit is contained in:
parent
d613ef42f2
commit
6399428a62
7 changed files with 64 additions and 7 deletions
|
|
@ -320,7 +320,7 @@ auto sum = [](int x, int y) { return x+y; };
|
|||
auto sum = [](int x, int y) -> int { return x+y; };
|
||||
</pre></div>
|
||||
|
||||
<p>The lambda functions are removed from the wrapper class for now, because of the lack of support
|
||||
<p>The lambda functions are removed from the wrappers for now, because of the lack of support
|
||||
for closures (scope of the lambda functions) in the target languages.</p>
|
||||
|
||||
<p>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,26 @@
|
|||
*/
|
||||
%module cpp0x_lambda_functions
|
||||
|
||||
#pragma SWIG nowarn=SWIGWARN_LANG_NATIVE_UNIMPL
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda1;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda2;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda3;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda4;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda5;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda6;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda7;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda8;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda9;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda10;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda11;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda12;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda13;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda14;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda15;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda16;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda17;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) lambda18;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) Space1::lambda19;
|
||||
%warnfilter(SWIGWARN_CPP11_LAMBDA) Space1::Space2::lambda20;
|
||||
|
||||
%inline %{
|
||||
/* Defined lambda function with return value. */
|
||||
|
|
@ -44,6 +63,13 @@ auto lambda16 = [] { return thing; };
|
|||
auto lambda17 = [] { return thing; }();
|
||||
constexpr auto lambda18 = [] (int x, int y) mutable throw(int) { return x+y; };
|
||||
|
||||
namespace Space1 {
|
||||
constexpr auto lambda19 = [] (int x, int y) mutable throw(int) { return x+y; };
|
||||
namespace Space2 {
|
||||
constexpr auto lambda20 = [] (int x, int y) mutable throw(int) { return x+y; };
|
||||
}
|
||||
}
|
||||
|
||||
int runLambda1() {
|
||||
return lambda1(5,6);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3165,7 +3165,12 @@ c_declaration : c_decl {
|
|||
appendChild($$,firstChild($5));
|
||||
}
|
||||
}
|
||||
| cpp_lambda_decl { Swig_warning(WARN_CPP11_LAMBDA, cparse_file, cparse_line,"Lambda expressions and closures are not fully supported yet.\n"); $$ = $1; }
|
||||
| cpp_lambda_decl {
|
||||
$$ = $1;
|
||||
SWIG_WARN_NODE_BEGIN($$);
|
||||
Swig_warning(WARN_CPP11_LAMBDA, cparse_file, cparse_line, "Lambda expressions and closures are not fully supported yet.\n");
|
||||
SWIG_WARN_NODE_END($$);
|
||||
}
|
||||
| USING idcolon EQUAL { skip_decl(); Swig_warning(WARN_CPP11_ALIAS_DECLARATION, cparse_file, cparse_line,"The 'using' keyword in type aliasing is not fully supported yet.\n"); $$ = 0; }
|
||||
| TEMPLATE LESSTHAN template_parms GREATERTHAN USING idcolon EQUAL { skip_decl(); Swig_warning(WARN_CPP11_ALIAS_TEMPLATE, cparse_file, cparse_line,"The 'using' keyword in template aliasing is not fully supported yet.\n"); $$ = 0; }
|
||||
;
|
||||
|
|
@ -3366,13 +3371,19 @@ cpp_alternate_rettype : primitive_type { $$ = $1; }
|
|||
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 {
|
||||
$$ = 0;
|
||||
$$ = 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 {
|
||||
$$ = 0;
|
||||
$$ = new_node("lambda");
|
||||
Setattr($$,"name",$3);
|
||||
add_symbols($$);
|
||||
}
|
||||
| storage_class AUTO idcolon EQUAL lambda_introducer lambda_body lambda_tail {
|
||||
$$ = 0;
|
||||
$$ = new_node("lambda");
|
||||
Setattr($$,"name",$3);
|
||||
add_symbols($$);
|
||||
}
|
||||
;
|
||||
|
||||
|
|
|
|||
|
|
@ -136,6 +136,12 @@ public:
|
|||
return SWIG_OK;
|
||||
}
|
||||
|
||||
virtual int lambdaDeclaration(Node *n) {
|
||||
show_attributes(n);
|
||||
emit_children(n);
|
||||
return SWIG_OK;
|
||||
}
|
||||
|
||||
virtual int enumDeclaration(Node *n) {
|
||||
show_attributes(n);
|
||||
emit_children(n);
|
||||
|
|
|
|||
|
|
@ -139,6 +139,8 @@ int Dispatcher::emit_one(Node *n) {
|
|||
ret = namespaceDeclaration(n);
|
||||
} else if (strcmp(tag, "template") == 0) {
|
||||
ret = templateDeclaration(n);
|
||||
} else if (strcmp(tag, "lambda") == 0) {
|
||||
ret = lambdaDeclaration(n);
|
||||
}
|
||||
|
||||
/* ===============================================================
|
||||
|
|
@ -285,6 +287,9 @@ int Dispatcher::classDeclaration(Node *n) {
|
|||
int Dispatcher::templateDeclaration(Node *n) {
|
||||
return defaultHandler(n);
|
||||
}
|
||||
int Dispatcher::lambdaDeclaration(Node *n) {
|
||||
return defaultHandler(n);
|
||||
}
|
||||
int Dispatcher::classforwardDeclaration(Node *n) {
|
||||
return defaultHandler(n);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@ public:
|
|||
virtual int usingDeclaration(Node *n);
|
||||
virtual int namespaceDeclaration(Node *n);
|
||||
virtual int templateDeclaration(Node *n);
|
||||
virtual int lambdaDeclaration(Node *n);
|
||||
|
||||
enum AccessMode { PUBLIC, PRIVATE, PROTECTED };
|
||||
|
||||
|
|
|
|||
|
|
@ -524,7 +524,7 @@ class TypePass:private Dispatcher {
|
|||
}
|
||||
|
||||
/* ------------------------------------------------------------
|
||||
* namespaceDeclaration()
|
||||
* templateDeclaration()
|
||||
* ------------------------------------------------------------ */
|
||||
|
||||
virtual int templateDeclaration(Node *n) {
|
||||
|
|
@ -543,6 +543,14 @@ class TypePass:private Dispatcher {
|
|||
return SWIG_OK;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------
|
||||
* lambdaDeclaration()
|
||||
* ------------------------------------------------------------ */
|
||||
|
||||
virtual int lambdaDeclaration(Node *) {
|
||||
return SWIG_OK;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------
|
||||
* classforwardDeclaration()
|
||||
* ------------------------------------------------------------ */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue