diff --git a/Examples/test-suite/cpp11_ref_qualifiers.i b/Examples/test-suite/cpp11_ref_qualifiers.i index 2115843a3..7e9f0e170 100644 --- a/Examples/test-suite/cpp11_ref_qualifiers.i +++ b/Examples/test-suite/cpp11_ref_qualifiers.i @@ -74,3 +74,18 @@ struct Renames { string S3(int i) const & { return string(); } }; %} + +// Conversion operators +%rename(StringConvertCopy) operator string() &; +%rename(StringConvertMove) operator string() &&; +%feature("ignore", "0") operator string() &&; // unignore as it is ignored by default + +%inline %{ +struct ConversionOperators { + virtual operator string() & { return string(); } + virtual operator string() && { return std::move(string()); } +}; +struct ConversionOperators2 { + virtual operator string() && { return std::move(string()); } +}; +%} diff --git a/Examples/test-suite/java/cpp11_ref_qualifiers_runme.java b/Examples/test-suite/java/cpp11_ref_qualifiers_runme.java index bbe6be8e3..4755f8d1f 100644 --- a/Examples/test-suite/java/cpp11_ref_qualifiers_runme.java +++ b/Examples/test-suite/java/cpp11_ref_qualifiers_runme.java @@ -42,6 +42,15 @@ public class cpp11_ref_qualifiers_runme { r.SS1(0); r.SS2(0); r.SS3(0); + + // Conversion operators + String s = null; + ConversionOperators co = new ConversionOperators(); + s = co.StringConvertCopy(); + s = co.StringConvertMove(); + + ConversionOperators2 co2 = new ConversionOperators2(); + s = co2.StringConvertMove(); } } diff --git a/Examples/test-suite/python/cpp11_ref_qualifiers_runme.py b/Examples/test-suite/python/cpp11_ref_qualifiers_runme.py index 47c474218..d3aa98c47 100644 --- a/Examples/test-suite/python/cpp11_ref_qualifiers_runme.py +++ b/Examples/test-suite/python/cpp11_ref_qualifiers_runme.py @@ -35,3 +35,11 @@ r.RR3() r.SS1(0) r.SS2(0) r.SS3(0) + +# Conversion operators +co = cpp11_ref_qualifiers.ConversionOperators() +s = co.StringConvertCopy() +s = co.StringConvertMove() + +co2 = cpp11_ref_qualifiers.ConversionOperators2() +s = co2.StringConvertMove() diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index f9dc6b32f..a982ce011 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -4656,6 +4656,7 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p if ($8.qualifier) { SwigType_push($4,$8.qualifier); } + Setattr($$,"refqualifier",$8.refqualifier); Setattr($$,"decl",$4); Setattr($$,"parms",$6); Setattr($$,"conversion_operator","1"); @@ -4673,6 +4674,7 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p if ($8.qualifier) { SwigType_push(decl,$8.qualifier); } + Setattr($$,"refqualifier",$8.refqualifier); Setattr($$,"decl",decl); Setattr($$,"parms",$6); Setattr($$,"conversion_operator","1"); @@ -4690,6 +4692,7 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p if ($8.qualifier) { SwigType_push(decl,$8.qualifier); } + Setattr($$,"refqualifier",$8.refqualifier); Setattr($$,"decl",decl); Setattr($$,"parms",$6); Setattr($$,"conversion_operator","1"); @@ -4709,6 +4712,7 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p if ($9.qualifier) { SwigType_push(decl,$9.qualifier); } + Setattr($$,"refqualifier",$9.refqualifier); Setattr($$,"decl",decl); Setattr($$,"parms",$7); Setattr($$,"conversion_operator","1"); @@ -4725,6 +4729,7 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p if ($7.qualifier) { SwigType_push(t,$7.qualifier); } + Setattr($$,"refqualifier",$7.refqualifier); Setattr($$,"decl",t); Setattr($$,"parms",$5); Setattr($$,"conversion_operator","1"); @@ -4819,7 +4824,7 @@ cpp_vend : cpp_const SEMI { Clear(scanner_ccode); $$.val = 0; $$.qualifier = $1.qualifier; - $$.refqualifier = 0; + $$.refqualifier = $1.refqualifier; $$.bitfield = 0; $$.throws = $1.throws; $$.throwf = $1.throwf; @@ -4829,7 +4834,7 @@ cpp_vend : cpp_const SEMI { Clear(scanner_ccode); $$.val = $3.val; $$.qualifier = $1.qualifier; - $$.refqualifier = 0; + $$.refqualifier = $1.refqualifier; $$.bitfield = 0; $$.throws = $1.throws; $$.throwf = $1.throwf; @@ -4839,7 +4844,7 @@ cpp_vend : cpp_const SEMI { skip_balanced('{','}'); $$.val = 0; $$.qualifier = $1.qualifier; - $$.refqualifier = 0; + $$.refqualifier = $1.refqualifier; $$.bitfield = 0; $$.throws = $1.throws; $$.throwf = $1.throwf;