Symbol base_symbol = null;
FormalParameter this_parameter = null;
bool may_access_instance_members = false;
+ bool may_access_klass_members = false;
symbol_reference = null;
var cm = (CreationMethod) sym;
this_parameter = cm.this_parameter;
may_access_instance_members = true;
+ may_access_klass_members = true;
} else if (sym is Property) {
var prop = (Property) sym;
this_parameter = prop.this_parameter;
may_access_instance_members = (prop.binding == MemberBinding.INSTANCE);
+ may_access_klass_members = (prop.binding != MemberBinding.STATIC);
} else if (sym is Constructor) {
var c = (Constructor) sym;
this_parameter = c.this_parameter;
- may_access_instance_members = true;
+ may_access_instance_members = (c.binding == MemberBinding.INSTANCE);
+ may_access_klass_members = true;
} else if (sym is Destructor) {
var d = (Destructor) sym;
this_parameter = d.this_parameter;
- may_access_instance_members = true;
+ may_access_instance_members = (d.binding == MemberBinding.INSTANCE);
+ may_access_klass_members = true;
} else if (sym is Method) {
var m = (Method) sym;
this_parameter = m.this_parameter;
may_access_instance_members = (m.binding == MemberBinding.INSTANCE);
+ may_access_klass_members = (m.binding != MemberBinding.STATIC);
}
}
// inner expression is base access
// access to instance members of the base type possible
may_access_instance_members = true;
+ may_access_klass_members = true;
}
}
}
// inner expression is variable, field, or parameter
// access to instance members of the corresponding type possible
may_access_instance_members = true;
+ may_access_klass_members = true;
}
}
}
if (symbol_reference != null) {
may_access_instance_members = true;
+ may_access_klass_members = true;
}
}
}
return false;
}
}
- if ((instance || klass) && !may_access_instance_members) {
+ if ((instance && !may_access_instance_members) ||
+ (klass && !may_access_klass_members)) {
prototype_access = true;
if (symbol_reference is Method) {
checked = true;
- inner.check (analyzer);
+ if (!inner.check (analyzer)) {
+ error = true;
+ return false;
+ }
+
+ if (inner.value_type == null) {
+ error = true;
+ Report.error (source_reference, "unsupported lvalue in postfix expression");
+ return false;
+ }
+
+ if (inner is MemberAccess) {
+ var ma = (MemberAccess) inner;
+
+ if (ma.prototype_access) {
+ error = true;
+ Report.error (source_reference, "Access to instance member `%s' denied".printf (ma.symbol_reference.get_full_name ()));
+ return false;
+ }
+
+ if (ma.error || ma.symbol_reference == null) {
+ error = true;
+ /* if no symbol found, skip this check */
+ return false;
+ }
+ } else {
+ error = true;
+ Report.error (source_reference, "unsupported lvalue in postfix expression");
+ return false;
+ }
value_type = inner.value_type;