Restore missing variable setters for types containing non-assignable static members

A struct/class that contains a non-assignable member variable is
actually assignable itself. Only non-static members, not static members,
contribute to the containing class being non-assignable.

Recent regression fix from a few commits back.
This commit is contained in:
William S Fulton 2023-09-07 21:40:12 +01:00
parent 4f337d6495
commit ec53b06b8a
7 changed files with 49 additions and 4 deletions

View File

@ -121,4 +121,10 @@ MemberPrivateVar StaticMembersMemberVars::StaticMemberPrivate;
MemberPublicVar GlobalMemberPublic;
MemberProtectedVar GlobalMemberProtected;
MemberPrivateVar GlobalMemberPrivate;
// Setters and getters available
struct StaticMembersMemberVarsHolder {
StaticMembersMemberVars Member;
};
StaticMembersMemberVars GlobalStaticMembersMemberVars;
%}

View File

@ -113,4 +113,10 @@ MemberPrivateVar StaticMembersMemberVars::StaticMemberPrivate;
MemberPublicVar GlobalMemberPublic;
MemberProtectedVar GlobalMemberProtected;
MemberPrivateVar GlobalMemberPrivate;
// Setters and getters available
struct StaticMembersMemberVarsHolder {
StaticMembersMemberVars Member;
};
StaticMembersMemberVars GlobalStaticMembersMemberVars;
%}

View File

@ -121,4 +121,10 @@ MemberPrivateVar StaticMembersMemberVars::StaticMemberPrivate;
MemberPublicVar GlobalMemberPublic;
MemberProtectedVar GlobalMemberProtected;
MemberPrivateVar GlobalMemberPrivate;
// Setters and getters available
struct StaticMembersMemberVarsHolder {
StaticMembersMemberVars Member;
};
StaticMembersMemberVars GlobalStaticMembersMemberVars;
%}

View File

@ -77,5 +77,13 @@ public class assign_reference_runme {
MemberPublicVar gmpv1 = assign_reference.getGlobalMemberPublic();
MemberProtectedVar gmpv2 = assign_reference.getGlobalMemberProtected();
MemberPrivateVar gmpv3 = assign_reference.getGlobalMemberPrivate();
// Setters and getters available
StaticMembersMemberVarsHolder smmvh = new StaticMembersMemberVarsHolder();
StaticMembersMemberVars member = smmvh.getMember();
smmvh.setMember(member);
StaticMembersMemberVars smmv = assign_reference.getGlobalStaticMembersMemberVars();
assign_reference.setGlobalStaticMembersMemberVars(smmv);
}
}

View File

@ -73,5 +73,13 @@ public class cpp11_assign_delete_runme {
MemberPublicVar gmpv1 = cpp11_assign_delete.getGlobalMemberPublic();
MemberProtectedVar gmpv2 = cpp11_assign_delete.getGlobalMemberProtected();
MemberPrivateVar gmpv3 = cpp11_assign_delete.getGlobalMemberPrivate();
// Setters and getters available
StaticMembersMemberVarsHolder smmvh = new StaticMembersMemberVarsHolder();
StaticMembersMemberVars member = smmvh.getMember();
smmvh.setMember(member);
StaticMembersMemberVars smmv = cpp11_assign_delete.getGlobalStaticMembersMemberVars();
cpp11_assign_delete.setGlobalStaticMembersMemberVars(smmv);
}
}

View File

@ -77,5 +77,13 @@ public class cpp11_assign_rvalue_reference_runme {
MemberPublicVar gmpv1 = cpp11_assign_rvalue_reference.getGlobalMemberPublic();
MemberProtectedVar gmpv2 = cpp11_assign_rvalue_reference.getGlobalMemberProtected();
MemberPrivateVar gmpv3 = cpp11_assign_rvalue_reference.getGlobalMemberPrivate();
// Setters and getters available
StaticMembersMemberVarsHolder smmvh = new StaticMembersMemberVarsHolder();
StaticMembersMemberVars member = smmvh.getMember();
smmvh.setMember(member);
StaticMembersMemberVars smmv = cpp11_assign_rvalue_reference.getGlobalStaticMembersMemberVars();
cpp11_assign_rvalue_reference.setGlobalStaticMembersMemberVars(smmv);
}
}

View File

@ -667,7 +667,7 @@ class Allocate:public Dispatcher {
}
}
bool is_assignable(Node *n, bool& is_reference) {
bool is_assignable(Node *n, bool &is_reference) {
bool assignable = true;
SwigType *ty = Copy(Getattr(n, "type"));
SwigType_push(ty, Getattr(n, "decl"));
@ -1150,7 +1150,8 @@ Allocate():
/* Check to see if this is a static member or not. If so, we add an attribute
cplus:staticbase that saves the current class */
if (Swig_storage_isstatic(n)) {
int is_static = Swig_storage_isstatic(n);
if (is_static) {
Setattr(n, "cplus:staticbase", inclass);
}
@ -1161,8 +1162,10 @@ Allocate():
if (!assignable) {
SetFlag(n, "feature:immutable");
}
if (!assignable || is_reference)
SetFlag(inclass, "allocate:has_nonassignable"); // The class has a variable that cannot be assigned to
if (!is_static) {
if (!assignable || is_reference)
SetFlag(inclass, "allocate:has_nonassignable"); // The class has a variable that cannot be assigned to
}
}
String *name = Getattr(n, "name");