]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Property must be writable when invoking ReturnsModifiedPointer method
authorRico Tzschichholz <ricotz@ubuntu.com>
Sat, 4 Jul 2020 07:07:06 +0000 (09:07 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sun, 26 Jul 2020 08:38:33 +0000 (10:38 +0200)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1023

tests/Makefile.am
tests/semantic/property-method-returns-modified-pointer.test [new file with mode: 0644]
vala/valamethodcall.vala

index ce55ed22b12d8c654d608c49fabc6ccf765ae23d..87830dd49641d0308513bb7a359fcf6e58d43e08 100644 (file)
@@ -868,6 +868,7 @@ TESTS = \
        semantic/property-accessibility.test \
        semantic/property-construct.test \
        semantic/property-initializer-type.test \
+       semantic/property-method-returns-modified-pointer.test \
        semantic/property-override.test \
        semantic/property-override-class.test \
        semantic/property-override-interface.test \
diff --git a/tests/semantic/property-method-returns-modified-pointer.test b/tests/semantic/property-method-returns-modified-pointer.test
new file mode 100644 (file)
index 0000000..ae8ebbe
--- /dev/null
@@ -0,0 +1,10 @@
+Invalid Code
+
+class Foo {
+       public List<string> bar { get; }
+}
+
+void main () {
+       var foo = new Foo ();
+       foo.bar.append ("foo");
+}
index a1782217a06696ad1b4dca422d19b49c0ea2dbfd..980bd3f86baadaa5f9e2317f101a7e317dcb9f80 100644 (file)
@@ -532,7 +532,13 @@ public class Vala.MethodCall : Expression {
                                value_type.floating_reference = true;
                        }
                        if (m.returns_modified_pointer) {
-                               ((MemberAccess) call).inner.lvalue = true;
+                               unowned Expression inner = ((MemberAccess) call).inner;
+                               inner.lvalue = true;
+                               unowned Property? prop = inner.symbol_reference as Property;
+                               if (prop != null && (prop.set_accessor == null || !prop.set_accessor.writable)) {
+                                       error = true;
+                                       Report.error (inner.source_reference, "Property `%s' is read-only".printf (prop.get_full_name ()));
+                               }
                        }
                        // avoid passing possible null to ref_sink_function without checking
                        if (tree_can_fail && !value_type.nullable && value_type.floating_reference && ret_type is ObjectType) {