]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix calling methods on struct pointers
authorLuca Bruno <lucabru@src.gnome.org>
Sat, 25 Jan 2014 13:57:18 +0000 (14:57 +0100)
committerLuca Bruno <lucabru@src.gnome.org>
Sat, 25 Jan 2014 14:33:29 +0000 (15:33 +0100)
Fixes bug 686190

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/structs/bug686190.vala [new file with mode: 0644]
vala/valamemberaccess.vala

index 488d434b1a034213b469ac13b377c782883e4c31..a48df496240b0c065366c3a0250ede2b56f59c92 100644 (file)
@@ -5121,6 +5121,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
        public override void visit_pointer_indirection (PointerIndirection expr) {
                set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, get_cvalue (expr.inner)));
+               ((GLibValue) expr.target_value).lvalue = get_lvalue (expr.inner.target_value);
        }
 
        public override void visit_addressof_expression (AddressofExpression expr) {
index 141b0484bcb6ea9ab0d3cb4969013a72f3fd0861..85a92139b10791a02f5b9695ea998b35392f98d8 100644 (file)
@@ -94,6 +94,7 @@ TESTS = \
        structs/bug667890.vala \
        structs/bug669580.vala \
        structs/bug685177.vala \
+       structs/bug686190.vala \
        structs/bug690380.vala \
        delegates/delegates.vala \
        delegates/bug539166.vala \
diff --git a/tests/structs/bug686190.vala b/tests/structs/bug686190.vala
new file mode 100644 (file)
index 0000000..4d26975
--- /dev/null
@@ -0,0 +1,14 @@
+struct Foo {
+       int x;
+
+       public void meth () {
+               x = 10;
+       }
+}
+
+void main () {
+       Foo foo = Foo ();
+       Foo* bar = &foo;
+       bar.meth ();
+       assert (foo.x == 10);
+}
index af9f51f383c171500f3b9985ecb49320e6853409..b0c48ee4fca80d1991b3c475bdba7e4a7b6ec9e7 100644 (file)
@@ -891,10 +891,17 @@ public class Vala.MemberAccess : Expression {
                var this_access = inner.symbol_reference is Parameter && inner.symbol_reference.name == "this";
                var struct_or_array = (inner.value_type is StructValueType && !inner.value_type.nullable) || 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) {
+               var ma = inner as MemberAccess;
+               if (ma == null && struct_or_array && inner is PointerIndirection) {
+                       // (*struct)->method()
+                       ma = ((PointerIndirection) inner).inner as MemberAccess;
+               }
+
+               if (instance && struct_or_array && (symbol_reference is Method || lvalue) && ((ma != null && ma.symbol_reference is Variable) || inner is ElementAccess) && !this_access) {
                        inner.lvalue = true;
-                       if (inner is MemberAccess) {
-                               ((MemberAccess) inner).check_lvalue_access ();
+                       if (ma != null) {
+                               ma.lvalue = true;
+                               ma.check_lvalue_access ();
                        }
                }
        }