Use exact type for temporary variable wrapping parameters with default args and compactdefaultargs

When wrapping a default argument such as 'const bool& x = true'
a variable with the exact same type, such as:

  bool const &arg2_defvalue = true;

is now used in the generated code instead of a dereferenced type:

  bool arg2_defvalue = true;

This can still be used for the wrapped argument without any other
changes:

  bool *arg2 = (bool *) &arg2_defrvalue;

and the lifetimes are still the same for the temporary variable.

Works around some typedef issues for enum classes introduced in the
previous commit in the cpp11_strongly_typed_enumerations testcase,
when wrapping a parameter 'const PRINT_SETUP& e = PRINT_SETUP::TO_CONSOLE'
The temporary variable being generated became:

  enum MyClass::PRINT_SETUP arg2_defvalue = MyClass::PRINT_SETUP::TO_CONSOLE ;

The enum in the type is wrong for an enum class. Now the original type
is used:

  MyClass::PRINT_SETUP const &arg2_defvalue = MyClass::PRINT_SETUP::TO_CONSOLE ;
This commit is contained in:
William S Fulton 2024-11-04 19:39:51 +00:00
parent 5c2e83dd1a
commit 40b6cc684f
1 changed files with 12 additions and 40 deletions

View File

@ -240,27 +240,13 @@ int Swig_cargs(Wrapper *w, ParmList *p) {
int tycode = SwigType_type(type);
if (tycode == T_REFERENCE) {
if (pvalue) {
SwigType *tvalue;
String *defname, *defvalue, *rvalue, *qvalue;
rvalue = SwigType_typedef_resolve_all(pvalue);
qvalue = SwigType_typedef_qualified(rvalue);
defname = NewStringf("%s_defvalue", lname);
tvalue = Copy(type);
SwigType_del_reference(tvalue);
tycode = SwigType_type(tvalue);
if (tycode != T_USER) {
/* plain primitive type, we copy the def value */
String *lstr = SwigType_lstr(tvalue, defname);
defvalue = NewStringf("%s = %s", lstr, qvalue);
Delete(lstr);
} else {
/* user type, we copy the reference value */
String *str = SwigType_str(type, defname);
defvalue = NewStringf("%s = %s", str, qvalue);
Delete(str);
}
String *rvalue = SwigType_typedef_resolve_all(pvalue);
String *qvalue = SwigType_typedef_qualified(rvalue);
String *defname = NewStringf("%s_defvalue", lname);
String *str = SwigType_str(pt, defname);
String *defvalue = NewStringf("%s = %s", str, qvalue);
Wrapper_add_localv(w, defname, defvalue, NIL);
Delete(tvalue);
Delete(str);
Delete(rvalue);
Delete(qvalue);
Delete(defname);
@ -268,27 +254,13 @@ int Swig_cargs(Wrapper *w, ParmList *p) {
}
} else if (tycode == T_RVALUE_REFERENCE) {
if (pvalue) {
SwigType *tvalue;
String *defname, *defvalue, *rvalue, *qvalue;
rvalue = SwigType_typedef_resolve_all(pvalue);
qvalue = SwigType_typedef_qualified(rvalue);
defname = NewStringf("%s_defrvalue", lname);
tvalue = Copy(type);
SwigType_del_rvalue_reference(tvalue);
tycode = SwigType_type(tvalue);
if (tycode != T_USER) {
/* plain primitive type, we copy the def value */
String *lstr = SwigType_lstr(tvalue, defname);
defvalue = NewStringf("%s = %s", lstr, qvalue);
Delete(lstr);
} else {
/* user type, we copy the reference value */
String *str = SwigType_str(type, defname);
defvalue = NewStringf("%s = %s", str, qvalue);
Delete(str);
}
String *rvalue = SwigType_typedef_resolve_all(pvalue);
String *qvalue = SwigType_typedef_qualified(rvalue);
String *defname = NewStringf("%s_defrvalue", lname);
String *str = SwigType_str(pt, defname);
String *defvalue = NewStringf("%s = %s", str, qvalue);
Wrapper_add_localv(w, defname, defvalue, NIL);
Delete(tvalue);
Delete(str);
Delete(rvalue);
Delete(qvalue);
Delete(defname);