Added initial support for C++0x decltype().
Added testcase cpp0x_decltype. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/gsoc2009-matevz@11525 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
8a4efbc6d3
commit
e2e9b04b3d
5 changed files with 58 additions and 3 deletions
|
|
@ -411,7 +411,8 @@ CPP0X_TEST_CASES = \
|
||||||
cpp0x_rvalue_reference \
|
cpp0x_rvalue_reference \
|
||||||
cpp0x_variadic_templates \
|
cpp0x_variadic_templates \
|
||||||
cpp0x_alternate_function_syntax \
|
cpp0x_alternate_function_syntax \
|
||||||
cpp0x_userdefined_literals
|
cpp0x_userdefined_literals \
|
||||||
|
cpp0x_decltype
|
||||||
# cpp0x_hash_types # not fully implemented yet
|
# cpp0x_hash_types # not fully implemented yet
|
||||||
# cpp0x_lambda_functions # not supported by GCC or MSVC yet
|
# cpp0x_lambda_functions # not supported by GCC or MSVC yet
|
||||||
# cpp0x_null_pointer_constant # not supported by any compilers yet
|
# cpp0x_null_pointer_constant # not supported by any compilers yet
|
||||||
|
|
|
||||||
19
Examples/test-suite/cpp0x_decltype.i
Normal file
19
Examples/test-suite/cpp0x_decltype.i
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
/* This testcase checks whether Swig correctly uses the new 'decltype()'
|
||||||
|
introduced in C++0x.
|
||||||
|
*/
|
||||||
|
%module cpp0x_decltype
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
class A {
|
||||||
|
public:
|
||||||
|
int i;
|
||||||
|
decltype(i) j;
|
||||||
|
|
||||||
|
auto foo( decltype(i) a ) -> decltype(i) {
|
||||||
|
if (a==5)
|
||||||
|
return 10;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
%}
|
||||||
19
Examples/test-suite/python/cpp0x_decltype_runme.py
Normal file
19
Examples/test-suite/python/cpp0x_decltype_runme.py
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
import cpp0x_decltype
|
||||||
|
|
||||||
|
a = cpp0x_decltype.A()
|
||||||
|
a.i = 5
|
||||||
|
if a.i != 5:
|
||||||
|
raise RuntimeError, "Assignment to a.i failed."
|
||||||
|
|
||||||
|
a.j = 10
|
||||||
|
if a.j != 10:
|
||||||
|
raise RuntimeError, "Assignment to a.j failed."
|
||||||
|
|
||||||
|
b = a.foo(5)
|
||||||
|
if b != 10:
|
||||||
|
raise RuntimeError, "foo(5) should return 10."
|
||||||
|
|
||||||
|
b = a.foo(6)
|
||||||
|
if b != 0:
|
||||||
|
raise RuntimeError, "foo(6) should return 0."
|
||||||
|
|
||||||
|
|
@ -636,6 +636,8 @@ int yylex(void) {
|
||||||
return (CONSTEXPR);
|
return (CONSTEXPR);
|
||||||
if (strcmp(yytext, "thread_local") == 0)
|
if (strcmp(yytext, "thread_local") == 0)
|
||||||
return (THREAD_LOCAL);
|
return (THREAD_LOCAL);
|
||||||
|
if (strcmp(yytext, "decltype") == 0)
|
||||||
|
return (DECLTYPE);
|
||||||
if (strcmp(yytext, "virtual") == 0)
|
if (strcmp(yytext, "virtual") == 0)
|
||||||
return (VIRTUAL);
|
return (VIRTUAL);
|
||||||
if (strcmp(yytext, "static_assert") == 0)
|
if (strcmp(yytext, "static_assert") == 0)
|
||||||
|
|
|
||||||
|
|
@ -1493,7 +1493,7 @@ static void tag_nodes(Node *n, const_String_or_char_ptr attrname, DOH *value) {
|
||||||
%token NAME RENAME NAMEWARN EXTEND PRAGMA FEATURE VARARGS
|
%token NAME RENAME NAMEWARN EXTEND PRAGMA FEATURE VARARGS
|
||||||
%token ENUM
|
%token ENUM
|
||||||
%token CLASS TYPENAME PRIVATE PUBLIC PROTECTED COLON STATIC VIRTUAL FRIEND THROW CATCH EXPLICIT AUTO
|
%token CLASS TYPENAME PRIVATE PUBLIC PROTECTED COLON STATIC VIRTUAL FRIEND THROW CATCH EXPLICIT AUTO
|
||||||
%token STATIC_ASSERT CONSTEXPR THREAD_LOCAL /* C++0x keywords */
|
%token STATIC_ASSERT CONSTEXPR THREAD_LOCAL DECLTYPE /* C++0x keywords */
|
||||||
%token USING
|
%token USING
|
||||||
%token <node> NAMESPACE
|
%token <node> NAMESPACE
|
||||||
%token NATIVE INLINE
|
%token NATIVE INLINE
|
||||||
|
|
@ -1557,7 +1557,7 @@ static void tag_nodes(Node *n, const_String_or_char_ptr attrname, DOH *value) {
|
||||||
%type <p> templateparameter ;
|
%type <p> templateparameter ;
|
||||||
%type <id> templcpptype cpptype access_specifier;
|
%type <id> templcpptype cpptype access_specifier;
|
||||||
%type <node> base_specifier
|
%type <node> base_specifier
|
||||||
%type <type> type rawtype type_right anon_bitfield_type ;
|
%type <type> type rawtype type_right anon_bitfield_type decltype ;
|
||||||
%type <bases> base_list inherit raw_inherit;
|
%type <bases> base_list inherit raw_inherit;
|
||||||
%type <dtype> definetype def_args etype;
|
%type <dtype> definetype def_args etype;
|
||||||
%type <dtype> expr exprnum exprcompound valexpr;
|
%type <dtype> expr exprnum exprcompound valexpr;
|
||||||
|
|
@ -3128,6 +3128,7 @@ cpp_alternate_rettype : primitive_type { $$ = $1; }
|
||||||
| TYPE_TYPEDEF template_decl { $$ = NewStringf("%s%s",$1,$2); }
|
| TYPE_TYPEDEF template_decl { $$ = NewStringf("%s%s",$1,$2); }
|
||||||
| TYPE_RAW { $$ = $1; }
|
| TYPE_RAW { $$ = $1; }
|
||||||
| idcolon { $$ = $1; }
|
| idcolon { $$ = $1; }
|
||||||
|
| decltype { $$ = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
/* Lambda function syntax introduced in C++0x.
|
/* Lambda function syntax introduced in C++0x.
|
||||||
|
|
@ -5471,6 +5472,19 @@ type_right : primitive_type { $$ = $1;
|
||||||
| cpptype idcolon {
|
| cpptype idcolon {
|
||||||
$$ = NewStringf("%s %s", $1, $2);
|
$$ = NewStringf("%s %s", $1, $2);
|
||||||
}
|
}
|
||||||
|
| decltype {
|
||||||
|
$$ = $1;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
decltype : DECLTYPE LPAREN idcolon RPAREN {
|
||||||
|
Node *n = Swig_symbol_clookup($3,0);
|
||||||
|
if (!n) {
|
||||||
|
Swig_error(cparse_file, cparse_line, "Identifier %s not defined.\n", $3);
|
||||||
|
} else {
|
||||||
|
$$ = Getattr(n, "type");
|
||||||
|
}
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
primitive_type : primitive_type_list {
|
primitive_type : primitive_type_list {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue