structs/bug654753.vala \
structs/bug656693.vala \
structs/bug658048.vala \
+ structs/bug660426.vala \
delegates/delegates.vala \
delegates/bug539166.vala \
delegates/bug595610.vala \
if (context.profile == Profile.GOBJECT && ma != null && ma.symbol_reference is ArrayLengthField) {
// propagate lvalue for gobject length access
ma.inner.lvalue = true;
- ((MemberAccess) ma.inner).check_lvalue_struct_access ();
+ ((MemberAccess) ma.inner).check_lvalue_access ();
} else if (ma != null && ma.symbol_reference is Field &&
ma.inner != null && ma.inner.symbol_reference is Variable &&
ma.inner.value_type is StructValueType && !ma.inner.value_type.nullable) {
// propagate lvalue if container is a field and container.inner is a struct variable
ma.lvalue = true;
- ma.check_lvalue_struct_access ();
+ ma.check_lvalue_access ();
}
}
inner.value_type = this_parameter.variable_type.copy ();
inner.value_type.value_owned = false;
inner.symbol_reference = this_parameter;
- } else if (context.profile == Profile.GOBJECT && lvalue && member is ArrayLengthField) {
- inner.lvalue = true;
- ((MemberAccess) inner).check_lvalue_struct_access ();
} else {
- check_lvalue_struct_access ();
+ check_lvalue_access ();
}
if (context.experimental_non_null && instance && inner.value_type.nullable &&
return !error;
}
- public void check_lvalue_struct_access () {
+ public void check_lvalue_access () {
if (inner == null) {
return;
}
if (!instance) {
instance = symbol_reference is Property && ((Property) symbol_reference).binding == MemberBinding.INSTANCE;
}
+
var this_access = inner.symbol_reference is Parameter && inner.symbol_reference.name == "this";
- if (instance && inner.value_type is StructValueType && !inner.value_type.nullable && (symbol_reference is Method || lvalue) && ((inner is MemberAccess && inner.symbol_reference is Variable) || inner is ElementAccess) && !this_access) {
+ var struct_or_array = (inner.value_type is StructValueType && !inner.value_type.nullable) || (CodeContext.get ().profile == Profile.GOBJECT && inner.value_type is ArrayType);
+
+ if (instance && struct_or_array && (symbol_reference is Method || lvalue) && ((inner is MemberAccess && inner.symbol_reference is Variable) || inner is ElementAccess) && !this_access) {
inner.lvalue = true;
if (inner is MemberAccess) {
- ((MemberAccess) inner).check_lvalue_struct_access ();
+ ((MemberAccess) inner).check_lvalue_access ();
}
}
}