summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Bruno <lucabru@src.gnome.org>2014-01-25 14:57:18 +0100
committerLuca Bruno <lucabru@src.gnome.org>2014-01-25 15:33:29 +0100
commit95d0aa0246edbbeade95afaa569243841507bd07 (patch)
treeb8bcfa2035be1e014ebb1fe1f4f5969b51b46d79
parentfb6629c1462479cc5860227d67196394a7f504f6 (diff)
downloadvala-95d0aa0246edbbeade95afaa569243841507bd07.tar.gz
Fix calling methods on struct pointers
Fixes bug 686190
-rw-r--r--codegen/valaccodebasemodule.vala1
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/structs/bug686190.vala14
-rw-r--r--vala/valamemberaccess.vala13
4 files changed, 26 insertions, 3 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 488d434b1..a48df4962 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -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) {
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 141b0484b..85a92139b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -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
index 000000000..4d26975bf
--- /dev/null
+++ b/tests/structs/bug686190.vala
@@ -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);
+}
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index af9f51f38..b0c48ee4f 100644
--- a/vala/valamemberaccess.vala
+++ b/vala/valamemberaccess.vala
@@ -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 ();
}
}
}