Add lambda functions to the symbol tables and add ability to suppress lambda warnings.

This commit is contained in:
William S Fulton 2013-02-04 20:05:34 +00:00
commit 6399428a62
7 changed files with 64 additions and 7 deletions

View file

@ -320,7 +320,7 @@ auto sum = [](int x, int y) { return x+y; };
auto sum = [](int x, int y) -> int { return x+y; }; auto sum = [](int x, int y) -> int { return x+y; };
</pre></div> </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> for closures (scope of the lambda functions) in the target languages.</p>
<p> <p>

View file

@ -5,7 +5,26 @@
*/ */
%module cpp0x_lambda_functions %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 %{ %inline %{
/* Defined lambda function with return value. */ /* Defined lambda function with return value. */
@ -44,6 +63,13 @@ auto lambda16 = [] { return thing; };
auto lambda17 = [] { return thing; }(); auto lambda17 = [] { return thing; }();
constexpr auto lambda18 = [] (int x, int y) mutable throw(int) { return x+y; }; 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() { int runLambda1() {
return lambda1(5,6); return lambda1(5,6);
} }

View file

@ -3165,7 +3165,12 @@ c_declaration : c_decl {
appendChild($$,firstChild($5)); 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; } | 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; } | 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); 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 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 { | 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 { | storage_class AUTO idcolon EQUAL lambda_introducer lambda_body lambda_tail {
$$ = 0; $$ = new_node("lambda");
Setattr($$,"name",$3);
add_symbols($$);
} }
; ;

View file

@ -136,6 +136,12 @@ public:
return SWIG_OK; return SWIG_OK;
} }
virtual int lambdaDeclaration(Node *n) {
show_attributes(n);
emit_children(n);
return SWIG_OK;
}
virtual int enumDeclaration(Node *n) { virtual int enumDeclaration(Node *n) {
show_attributes(n); show_attributes(n);
emit_children(n); emit_children(n);

View file

@ -139,6 +139,8 @@ int Dispatcher::emit_one(Node *n) {
ret = namespaceDeclaration(n); ret = namespaceDeclaration(n);
} else if (strcmp(tag, "template") == 0) { } else if (strcmp(tag, "template") == 0) {
ret = templateDeclaration(n); 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) { int Dispatcher::templateDeclaration(Node *n) {
return defaultHandler(n); return defaultHandler(n);
} }
int Dispatcher::lambdaDeclaration(Node *n) {
return defaultHandler(n);
}
int Dispatcher::classforwardDeclaration(Node *n) { int Dispatcher::classforwardDeclaration(Node *n) {
return defaultHandler(n); return defaultHandler(n);
} }

View file

@ -99,6 +99,7 @@ public:
virtual int usingDeclaration(Node *n); virtual int usingDeclaration(Node *n);
virtual int namespaceDeclaration(Node *n); virtual int namespaceDeclaration(Node *n);
virtual int templateDeclaration(Node *n); virtual int templateDeclaration(Node *n);
virtual int lambdaDeclaration(Node *n);
enum AccessMode { PUBLIC, PRIVATE, PROTECTED }; enum AccessMode { PUBLIC, PRIVATE, PROTECTED };

View file

@ -524,7 +524,7 @@ class TypePass:private Dispatcher {
} }
/* ------------------------------------------------------------ /* ------------------------------------------------------------
* namespaceDeclaration() * templateDeclaration()
* ------------------------------------------------------------ */ * ------------------------------------------------------------ */
virtual int templateDeclaration(Node *n) { virtual int templateDeclaration(Node *n) {
@ -543,6 +543,14 @@ class TypePass:private Dispatcher {
return SWIG_OK; return SWIG_OK;
} }
/* ------------------------------------------------------------
* lambdaDeclaration()
* ------------------------------------------------------------ */
virtual int lambdaDeclaration(Node *) {
return SWIG_OK;
}
/* ------------------------------------------------------------ /* ------------------------------------------------------------
* classforwardDeclaration() * classforwardDeclaration()
* ------------------------------------------------------------ */ * ------------------------------------------------------------ */