Add support for conversion operators with ref-qualifiers

This commit is contained in:
William S Fulton 2017-08-29 21:11:26 +01:00
commit 950edc1c00
4 changed files with 40 additions and 3 deletions

View file

@ -74,3 +74,18 @@ struct Renames {
string S3(int i) const & { return string(); } 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()); }
};
%}

View file

@ -42,6 +42,15 @@ public class cpp11_ref_qualifiers_runme {
r.SS1(0); r.SS1(0);
r.SS2(0); r.SS2(0);
r.SS3(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();
} }
} }

View file

@ -35,3 +35,11 @@ r.RR3()
r.SS1(0) r.SS1(0)
r.SS2(0) r.SS2(0)
r.SS3(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()

View file

@ -4656,6 +4656,7 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p
if ($8.qualifier) { if ($8.qualifier) {
SwigType_push($4,$8.qualifier); SwigType_push($4,$8.qualifier);
} }
Setattr($$,"refqualifier",$8.refqualifier);
Setattr($$,"decl",$4); Setattr($$,"decl",$4);
Setattr($$,"parms",$6); Setattr($$,"parms",$6);
Setattr($$,"conversion_operator","1"); Setattr($$,"conversion_operator","1");
@ -4673,6 +4674,7 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p
if ($8.qualifier) { if ($8.qualifier) {
SwigType_push(decl,$8.qualifier); SwigType_push(decl,$8.qualifier);
} }
Setattr($$,"refqualifier",$8.refqualifier);
Setattr($$,"decl",decl); Setattr($$,"decl",decl);
Setattr($$,"parms",$6); Setattr($$,"parms",$6);
Setattr($$,"conversion_operator","1"); Setattr($$,"conversion_operator","1");
@ -4690,6 +4692,7 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p
if ($8.qualifier) { if ($8.qualifier) {
SwigType_push(decl,$8.qualifier); SwigType_push(decl,$8.qualifier);
} }
Setattr($$,"refqualifier",$8.refqualifier);
Setattr($$,"decl",decl); Setattr($$,"decl",decl);
Setattr($$,"parms",$6); Setattr($$,"parms",$6);
Setattr($$,"conversion_operator","1"); Setattr($$,"conversion_operator","1");
@ -4709,6 +4712,7 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p
if ($9.qualifier) { if ($9.qualifier) {
SwigType_push(decl,$9.qualifier); SwigType_push(decl,$9.qualifier);
} }
Setattr($$,"refqualifier",$9.refqualifier);
Setattr($$,"decl",decl); Setattr($$,"decl",decl);
Setattr($$,"parms",$7); Setattr($$,"parms",$7);
Setattr($$,"conversion_operator","1"); Setattr($$,"conversion_operator","1");
@ -4725,6 +4729,7 @@ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN p
if ($7.qualifier) { if ($7.qualifier) {
SwigType_push(t,$7.qualifier); SwigType_push(t,$7.qualifier);
} }
Setattr($$,"refqualifier",$7.refqualifier);
Setattr($$,"decl",t); Setattr($$,"decl",t);
Setattr($$,"parms",$5); Setattr($$,"parms",$5);
Setattr($$,"conversion_operator","1"); Setattr($$,"conversion_operator","1");
@ -4819,7 +4824,7 @@ cpp_vend : cpp_const SEMI {
Clear(scanner_ccode); Clear(scanner_ccode);
$$.val = 0; $$.val = 0;
$$.qualifier = $1.qualifier; $$.qualifier = $1.qualifier;
$$.refqualifier = 0; $$.refqualifier = $1.refqualifier;
$$.bitfield = 0; $$.bitfield = 0;
$$.throws = $1.throws; $$.throws = $1.throws;
$$.throwf = $1.throwf; $$.throwf = $1.throwf;
@ -4829,7 +4834,7 @@ cpp_vend : cpp_const SEMI {
Clear(scanner_ccode); Clear(scanner_ccode);
$$.val = $3.val; $$.val = $3.val;
$$.qualifier = $1.qualifier; $$.qualifier = $1.qualifier;
$$.refqualifier = 0; $$.refqualifier = $1.refqualifier;
$$.bitfield = 0; $$.bitfield = 0;
$$.throws = $1.throws; $$.throws = $1.throws;
$$.throwf = $1.throwf; $$.throwf = $1.throwf;
@ -4839,7 +4844,7 @@ cpp_vend : cpp_const SEMI {
skip_balanced('{','}'); skip_balanced('{','}');
$$.val = 0; $$.val = 0;
$$.qualifier = $1.qualifier; $$.qualifier = $1.qualifier;
$$.refqualifier = 0; $$.refqualifier = $1.refqualifier;
$$.bitfield = 0; $$.bitfield = 0;
$$.throws = $1.throws; $$.throws = $1.throws;
$$.throwf = $1.throwf; $$.throwf = $1.throwf;