}
if (expr.inner is BaseAccess) {
+ var base_prop = prop;
if (prop.base_property != null) {
- var base_class = (Class) prop.base_property.parent_symbol;
+ base_prop = prop.base_property;
+ } else if (prop.base_interface_property != null) {
+ base_prop = prop.base_interface_property;
+ }
+ if (base_prop.parent_symbol is Class) {
+ var base_class = (Class) base_prop.parent_symbol;
var vcast = new CCodeFunctionCall (new CCodeIdentifier ("%s_CLASS".printf (get_ccode_upper_case_name (base_class, null))));
vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf (get_ccode_lower_case_name (current_class, null))));
var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, "get_%s".printf (prop.name)));
ccall.add_argument (get_cvalue (expr.inner));
set_cvalue (expr, ccall);
- } else if (prop.base_interface_property != null) {
- var base_iface = (Interface) prop.base_interface_property.parent_symbol;
+ } else if (base_prop.parent_symbol is Interface) {
+ var base_iface = (Interface) base_prop.parent_symbol;
string parent_iface_var = "%s_%s_parent_iface".printf (get_ccode_lower_case_name (current_class), get_ccode_lower_case_name (base_iface));
var ccall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (new CCodeIdentifier (parent_iface_var), "get_%s".printf (prop.name)));
--- /dev/null
+public abstract class ClassA : Object {
+ public abstract int flags { get; }
+}
+
+public class ClassB : ClassA {
+ public override int flags { get { return 1; } }
+}
+
+public class ClassC : ClassB {
+ public void foo() {
+ }
+}
+
+public class ClassD : ClassC {
+ public override int flags {
+ get {
+ var old_flags = base.flags;
+
+ return old_flags | 2;
+ }
+ }
+}
+
+void main () {
+ var d = new ClassD ();
+ assert (d.flags == 3);
+}