summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2021-01-06 12:19:10 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2021-01-09 20:58:09 +0100
commitf94695e369af6c5b6319041fb3100fcbebfc95b6 (patch)
tree4af7008f40b29ee0ab982c8fd65c1bedbee4f04e
parentef4402da46e3c2b626406f06f62072d6d2c57816 (diff)
downloadvala-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.vala10
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/objects/property-real-struct-assignment.vala56
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 ();
+}