From: Rico Tzschichholz Date: Sat, 4 Jul 2020 07:07:06 +0000 (+0200) Subject: vala: Property must be writable when invoking ReturnsModifiedPointer method X-Git-Tag: 0.46.12~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3f9cae9e19b20a9f8813d290f707fc9935e0c97;p=thirdparty%2Fvala.git vala: Property must be writable when invoking ReturnsModifiedPointer method Fixes https://gitlab.gnome.org/GNOME/vala/issues/1023 --- diff --git a/tests/Makefile.am b/tests/Makefile.am index ce55ed22b..87830dd49 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..ae8ebbe6f --- /dev/null +++ b/tests/semantic/property-method-returns-modified-pointer.test @@ -0,0 +1,10 @@ +Invalid Code + +class Foo { + public List bar { get; } +} + +void main () { + var foo = new Foo (); + foo.bar.append ("foo"); +} diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala index a1782217a..980bd3f86 100644 --- a/vala/valamethodcall.vala +++ b/vala/valamethodcall.vala @@ -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) {