[Go] Fix member variables in base classes to handle CWRAP_NATURAL_VAR

correctly.  Add a test case for the problem.

Fixes #339.
This commit is contained in:
Ian Lance Taylor 2015-06-20 17:42:44 -07:00
commit 11d8403c3c
4 changed files with 47 additions and 3 deletions

View file

@ -246,6 +246,7 @@ CPP_TEST_CASES += \
ignore_parameter \
import_nomodule \
inherit \
inherit_member \
inherit_missing \
inherit_same_name \
inherit_target_language \

View file

@ -0,0 +1,15 @@
package main
import wrap "./inherit_member"
func main() {
s := wrap.NewChild()
s.SetPvar("p")
s.SetCvar("c")
if s.GetPvar() != "p" {
panic(s.GetPvar())
}
if s.GetCvar() != "c" {
panic(s.GetCvar())
}
}

View file

@ -0,0 +1,17 @@
// Based on https://github.com/swig/swig/issues/339 .
%module inherit_member
%include <std_string.i>
%inline %{
struct parent {
std::string pvar;
};
struct child : public parent {
std::string cvar;
};
%}

View file

@ -3160,15 +3160,26 @@ private:
Setattr(var, "type", var_type);
SwigType *vt = Copy(var_type);
if (SwigType_isclass(vt)) {
SwigType_add_pointer(vt);
}
int flags = Extend | SmartPointer | use_naturalvar_mode(var);
if (isNonVirtualProtectedAccess(var)) {
flags |= CWRAP_ALL_PROTECTED_ACCESS;
}
// Copied from Swig_wrapped_member_var_type.
if (SwigType_isclass(vt)) {
if (flags & CWRAP_NATURAL_VAR) {
if (CPlusPlus) {
if (!SwigType_isconst(vt)) {
SwigType_add_qualifier(vt, "const");
}
SwigType_add_reference(vt);
}
} else {
SwigType_add_pointer(vt);
}
}
String *mname = Swig_name_member(getNSpace(), Getattr(var_class, "sym:name"), var_name);
if (is_assignable(var)) {