diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2021-01-06 12:19:10 +0100 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2021-01-09 20:58:09 +0100 |
commit | f94695e369af6c5b6319041fb3100fcbebfc95b6 (patch) | |
tree | 4af7008f40b29ee0ab982c8fd65c1bedbee4f04e | |
parent | ef4402da46e3c2b626406f06f62072d6d2c57816 (diff) | |
download | vala-f94695e369af6c5b6319041fb3100fcbebfc95b6.tar.gz |
codegen: Fix assignment of casted struct value to property
Usage of address-of operator requires lvalue access. Therefore use a
temporary variable to be passed to property setter.
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1126
-rw-r--r-- | codegen/valaccodebasemodule.vala | 10 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/objects/property-real-struct-assignment.vala | 56 |
3 files changed, 67 insertions, 0 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 5974c577a..27eb82326 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -6215,6 +6215,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { ccall.add_argument ((CCodeExpression) get_ccodenode (instance)); var cexpr = get_cvalue_ (value); if (prop.property_type.is_real_non_null_struct_type ()) { + //TODO Make use of get_lvalue (value) + if (!(cexpr is CCodeConstant || cexpr is CCodeIdentifier)) { + var temp_value = store_temp_value (value, instance); + cexpr = get_cvalue_ (temp_value); + } cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr); } ccall.add_argument (cexpr); @@ -6271,6 +6276,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { var cexpr = get_cvalue_ (value); if (prop.property_type.is_real_non_null_struct_type ()) { + //TODO Make use of get_lvalue (value) + if (!(cexpr is CCodeConstant || cexpr is CCodeIdentifier)) { + var temp_value = store_temp_value (value, instance); + cexpr = get_cvalue_ (temp_value); + } cexpr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr); } diff --git a/tests/Makefile.am b/tests/Makefile.am index 36e09469e..e8935b50d 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -385,6 +385,7 @@ TESTS = \ objects/property-construct-only-write.test \ objects/property-construct-only-write-foreign.test \ objects/property-delegate-owned.vala \ + objects/property-real-struct-assignment.vala \ objects/property-static.vala \ objects/regex.vala \ objects/signals.vala \ diff --git a/tests/objects/property-real-struct-assignment.vala b/tests/objects/property-real-struct-assignment.vala new file mode 100644 index 000000000..26790763c --- /dev/null +++ b/tests/objects/property-real-struct-assignment.vala @@ -0,0 +1,56 @@ +struct Foo { + string s; +} + +Foo? get_foo () { + return { "foo" }; +} + +class Manam : Object { + public virtual Foo faz { get; set; } +} + +class Bar : Manam { + public Foo foo { get; set; } + + public Bar () { + { + this.foo = get_foo (); + } + { + base.faz = get_foo (); + } + { + this.foo = (!) get_foo (); + } + { + base.faz = (!) get_foo (); + } + { + this.foo = (Foo) get_foo (); + } + { + base.faz = (Foo) get_foo (); + } + { + var f = get_foo (); + this.foo = (!) f; + } + { + var f = get_foo (); + base.faz = (!) f; + } + { + var f = get_foo (); + this.foo = (Foo) f; + } + { + var f = get_foo (); + base.faz = (Foo) f; + } + } +} + +void main() { + var bar = new Bar (); +} |