]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Set lvalue access for struct properties f9186d12f28911d98e6f41d58f595fa81de602cb
authorLuca Bruno <lucabru@src.gnome.org>
Fri, 2 Sep 2011 10:57:30 +0000 (12:57 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Fri, 2 Sep 2011 11:00:42 +0000 (13:00 +0200)
Fixes bug 658046.

codegen/valaccodememberaccessmodule.vala
tests/Makefile.am
tests/objects/bug658046.vala [new file with mode: 0644]
vala/valamemberaccess.vala

index 349a96ead1fe4f2e40b2ffdd3416dfba5383f462..deef89cd42bd4016d7b5c421fb48b6bf33dce0cd 100644 (file)
@@ -193,6 +193,10 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                CCodeExpression inst;
                                inst = new CCodeMemberAccess.pointer (pub_inst, "priv");
                                set_cvalue (expr, new CCodeMemberAccess.pointer (inst, get_ccode_name (prop.field)));
+                               if (expr.lvalue) {
+                                       // no temp variable
+                                       return;
+                               }
                        } else if (!get_ccode_no_accessor_method (prop)) {
                                var base_property = prop;
                                if (prop.base_property != null) {
index d1b1491f9bf6f45976717042c8d2fe842e59f1c7..25004eccc08302616e8e4ccc686be4d4d3b35e2a 100644 (file)
@@ -109,6 +109,7 @@ TESTS = \
        objects/bug646792.vala \
        objects/bug653138.vala \
        objects/bug654702.vala \
+       objects/bug658046.vala \
        errors/errors.vala \
        errors/bug567181.vala \
        errors/bug579101.vala \
diff --git a/tests/objects/bug658046.vala b/tests/objects/bug658046.vala
new file mode 100644 (file)
index 0000000..263246b
--- /dev/null
@@ -0,0 +1,17 @@
+struct Foo {
+       int i;
+}
+
+class Bar {
+       public Foo prop { get; protected set; }
+
+       public void baz () {
+               prop.i = 10;
+       }
+}
+
+void main () {
+       var bar = new Bar ();
+       bar.baz ();
+       assert (bar.prop.i == 10);
+}
index 1ec08dac3fa9025c858e4fb3c3bb24a2d2d80b15..9ced173af6a90a7d1dcba98ccdd01e5ad30d35e9 100644 (file)
@@ -829,7 +829,7 @@ public class Vala.MemberAccess : Expression {
                        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) {
+               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.symbol_reference is Property)) || inner is ElementAccess) && !this_access) {
                        inner.lvalue = true;
                        if (inner is MemberAccess) {
                                ((MemberAccess) inner).check_lvalue_struct_access ();