diff --git a/Examples/test-suite/common.mk b/Examples/test-suite/common.mk index cd97ae245..2d5082398 100644 --- a/Examples/test-suite/common.mk +++ b/Examples/test-suite/common.mk @@ -407,7 +407,8 @@ CPP0X_TEST_CASES = \ cpp0x_template_explicit \ cpp0x_uniform_initialization \ cpp0x_function_objects \ - cpp0x_strongly_typed_enumerations + cpp0x_strongly_typed_enumerations \ + cpp0x_rvalue_reference # cpp0x_alternate_function_syntax # not fully implemented yet # cpp0x_hash_types # not fully implemented yet # cpp0x_unrestricted_unions # not supported by any compilers yet diff --git a/Examples/test-suite/cpp0x_rvalue_reference.i b/Examples/test-suite/cpp0x_rvalue_reference.i new file mode 100644 index 000000000..0a7fa9147 --- /dev/null +++ b/Examples/test-suite/cpp0x_rvalue_reference.i @@ -0,0 +1,23 @@ +%module cpp0x_rvalue_reference + +%inline %{ +class A { +public: + int getAcopy() { return _a; } + int *getAptr() { return &_a; } + int &getAref() { return _a; } + int &&getAmove() { return _a; } + + void setAcopy(int a) { _a = a; } + void setAptr(int *a) { _a = *a; } + void setAref(int &a) { _a = a; } + void setAmove(int &&a) { _a = a; } + + void arg(int a); + void arg(int *a); + void arg(int &a); +// void arg(int &&a); // redefinition not allowed +private: + int _a; +}; +%} diff --git a/Examples/test-suite/python/cpp0x_rvalue_reference_runme.py b/Examples/test-suite/python/cpp0x_rvalue_reference_runme.py new file mode 100644 index 000000000..1f74cfaa8 --- /dev/null +++ b/Examples/test-suite/python/cpp0x_rvalue_reference_runme.py @@ -0,0 +1,22 @@ +import cpp0x_rvalue_reference + +a = cpp0x_rvalue_reference.A() + +a.setAcopy(5) +if a.getAcopy() != 5: + raise RunTimeError, "int A::getAcopy() value is ", a.getAcopy(), " should be 5" + +ptr = a.getAptr() + +a.setAptr(ptr) +if a.getAcopy() != 5: + raise RunTimeError, "after A::setAptr(): int A::getAcopy() value is ", a.getAcopy(), " should be 5" + +a.setAref(ptr) +if a.getAcopy() != 5: + raise RunTimeError, "after A::setAref(): int A::getAcopy() value is ", a.getAcopy(), " should be 5" + +a.setAmove(ptr) +if a.getAcopy() != 5: + raise RunTimeError, "after A::setAmove(): int A::getAcopy() value is ", a.getAcopy(), " should be 5" + diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index 1469efe20..f42e9657a 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -4804,7 +4804,16 @@ declarator : pointer notso_direct_declarator { $$ = $1; if (!$$.type) $$.type = NewStringEmpty(); } - | AND notso_direct_declarator { + | AND notso_direct_declarator { + $$ = $2; + $$.type = NewStringEmpty(); + SwigType_add_reference($$.type); + if ($2.type) { + SwigType_push($$.type,$2.type); + Delete($2.type); + } + } + | LAND notso_direct_declarator { $$ = $2; $$.type = NewStringEmpty(); SwigType_add_reference($$.type); @@ -5082,7 +5091,7 @@ abstract_declarator : pointer { Delete($2.type); } } - | AND { + | AND { $$.id = 0; $$.parms = 0; $$.have_parms = 0;