| |
@@ -0,0 +1,137 @@
|
| |
+ From c0121583cee85656862516e689f8b63555a0ff20 Mon Sep 17 00:00:00 2001
|
| |
+ From: Rico Tzschichholz <ricotz@ubuntu.com>
|
| |
+ Date: Tue, 31 Aug 2021 16:28:05 +0200
|
| |
+ Subject: [PATCH] codegen: Add missing cast to access base-class members in
|
| |
+ class/static ctor
|
| |
+
|
| |
+ Regression of 9cbd53b8d79aa4c394ddf49e766f2c15fc476906
|
| |
+
|
| |
+ Fixes https://gitlab.gnome.org/GNOME/vala/issues/1221
|
| |
+ ---
|
| |
+ codegen/valaccodebasemodule.vala | 8 +++++++-
|
| |
+ tests/objects/fields.c-expected | 16 ++++++++++++++++
|
| |
+ tests/objects/fields.vala | 20 ++++++++++++++++++++
|
| |
+ 3 files changed, 43 insertions(+), 1 deletion(-)
|
| |
+
|
| |
+ diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
|
| |
+ index 54fc3e184..f7321b72a 100644
|
| |
+ --- a/codegen/valaccodebasemodule.vala
|
| |
+ +++ b/codegen/valaccodebasemodule.vala
|
| |
+ @@ -2622,7 +2622,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
|
| |
+ cast = call;
|
| |
+ } else {
|
| |
+ // Accessing the member from a static or class constructor
|
| |
+ - cast = new CCodeIdentifier ("klass");
|
| |
+ + if (current_class == cl) {
|
| |
+ + cast = new CCodeIdentifier ("klass");
|
| |
+ + } else {
|
| |
+ + call = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_type_function (cl)));
|
| |
+ + call.add_argument (new CCodeIdentifier ("klass"));
|
| |
+ + cast = call;
|
| |
+ + }
|
| |
+ }
|
| |
+ return cast;
|
| |
+ }
|
| |
+ diff --git a/tests/objects/fields.c-expected b/tests/objects/fields.c-expected
|
| |
+ index 6d7391968..03828580c 100644
|
| |
+ --- a/tests/objects/fields.c-expected
|
| |
+ +++ b/tests/objects/fields.c-expected
|
| |
+ @@ -701,6 +701,10 @@ faz_base_init (FazClass * klass)
|
| |
+ _vala_assert (FAZ_GET_CLASS_PRIVATE (klass)->private_class_field == 42, "private_class_field == 42");
|
| |
+ FAZ_GET_CLASS_PRIVATE (klass)->private_class_field = 24;
|
| |
+ _vala_assert (FAZ_GET_CLASS_PRIVATE (klass)->private_class_field == 24, "private_class_field == 24");
|
| |
+ + _vala_assert (FOO_CLASS (klass)->public_base_class_field == 42, "public_base_class_field == 42");
|
| |
+ + FOO_CLASS (klass)->public_base_class_field = 24;
|
| |
+ + _vala_assert (FOO_CLASS (klass)->public_base_class_field == 24, "public_base_class_field == 24");
|
| |
+ + FOO_CLASS (klass)->public_base_class_field = 42;
|
| |
+ }
|
| |
+
|
| |
+ static void
|
| |
+ @@ -722,6 +726,10 @@ faz_class_init (FazClass * klass,
|
| |
+ _vala_assert (FAZ_GET_CLASS_PRIVATE (klass)->private_class_field == 42, "private_class_field == 42");
|
| |
+ FAZ_GET_CLASS_PRIVATE (klass)->private_class_field = 24;
|
| |
+ _vala_assert (FAZ_GET_CLASS_PRIVATE (klass)->private_class_field == 24, "private_class_field == 24");
|
| |
+ + _vala_assert (FOO_CLASS (klass)->public_base_class_field == 42, "public_base_class_field == 42");
|
| |
+ + FOO_CLASS (klass)->public_base_class_field = 24;
|
| |
+ + _vala_assert (FOO_CLASS (klass)->public_base_class_field == 24, "public_base_class_field == 24");
|
| |
+ + FOO_CLASS (klass)->public_base_class_field = 42;
|
| |
+ }
|
| |
+
|
| |
+ static void
|
| |
+ @@ -1000,6 +1008,10 @@ baz_base_init (BazClass * klass)
|
| |
+ _vala_assert (BAZ_GET_CLASS_PRIVATE (klass)->private_class_field == 42, "private_class_field == 42");
|
| |
+ BAZ_GET_CLASS_PRIVATE (klass)->private_class_field = 24;
|
| |
+ _vala_assert (BAZ_GET_CLASS_PRIVATE (klass)->private_class_field == 24, "private_class_field == 24");
|
| |
+ + _vala_assert (BAR_CLASS (klass)->public_base_class_field == 42, "public_base_class_field == 42");
|
| |
+ + BAR_CLASS (klass)->public_base_class_field = 24;
|
| |
+ + _vala_assert (BAR_CLASS (klass)->public_base_class_field == 24, "public_base_class_field == 24");
|
| |
+ + BAR_CLASS (klass)->public_base_class_field = 42;
|
| |
+ }
|
| |
+
|
| |
+ static void
|
| |
+ @@ -1021,6 +1033,10 @@ baz_class_init (BazClass * klass,
|
| |
+ _vala_assert (BAZ_GET_CLASS_PRIVATE (klass)->private_class_field == 42, "private_class_field == 42");
|
| |
+ BAZ_GET_CLASS_PRIVATE (klass)->private_class_field = 24;
|
| |
+ _vala_assert (BAZ_GET_CLASS_PRIVATE (klass)->private_class_field == 24, "private_class_field == 24");
|
| |
+ + _vala_assert (BAR_CLASS (klass)->public_base_class_field == 42, "public_base_class_field == 42");
|
| |
+ + BAR_CLASS (klass)->public_base_class_field = 24;
|
| |
+ + _vala_assert (BAR_CLASS (klass)->public_base_class_field == 24, "public_base_class_field == 24");
|
| |
+ + BAR_CLASS (klass)->public_base_class_field = 42;
|
| |
+ }
|
| |
+
|
| |
+ static void
|
| |
+ diff --git a/tests/objects/fields.vala b/tests/objects/fields.vala
|
| |
+ index 0872045bb..e14572bd9 100644
|
| |
+ --- a/tests/objects/fields.vala
|
| |
+ +++ b/tests/objects/fields.vala
|
| |
+ @@ -32,6 +32,11 @@ class Faz : Foo {
|
| |
+ assert (private_class_field == 42);
|
| |
+ private_class_field = 24;
|
| |
+ assert (private_class_field == 24);
|
| |
+ +
|
| |
+ + assert (public_base_class_field == 42);
|
| |
+ + public_base_class_field = 24;
|
| |
+ + assert (public_base_class_field == 24);
|
| |
+ + public_base_class_field = 42;
|
| |
+ }
|
| |
+
|
| |
+ static construct {
|
| |
+ @@ -42,6 +47,11 @@ class Faz : Foo {
|
| |
+ assert (private_class_field == 42);
|
| |
+ private_class_field = 24;
|
| |
+ assert (private_class_field == 24);
|
| |
+ +
|
| |
+ + assert (public_base_class_field == 42);
|
| |
+ + public_base_class_field = 24;
|
| |
+ + assert (public_base_class_field == 24);
|
| |
+ + public_base_class_field = 42;
|
| |
+ }
|
| |
+
|
| |
+ public void action () {
|
| |
+ @@ -132,6 +142,11 @@ class Baz : Bar {
|
| |
+ assert (private_class_field == 42);
|
| |
+ private_class_field = 24;
|
| |
+ assert (private_class_field == 24);
|
| |
+ +
|
| |
+ + assert (public_base_class_field == 42);
|
| |
+ + public_base_class_field = 24;
|
| |
+ + assert (public_base_class_field == 24);
|
| |
+ + public_base_class_field = 42;
|
| |
+ }
|
| |
+
|
| |
+ static construct {
|
| |
+ @@ -142,6 +157,11 @@ class Baz : Bar {
|
| |
+ assert (private_class_field == 42);
|
| |
+ private_class_field = 24;
|
| |
+ assert (private_class_field == 24);
|
| |
+ +
|
| |
+ + assert (public_base_class_field == 42);
|
| |
+ + public_base_class_field = 24;
|
| |
+ + assert (public_base_class_field == 24);
|
| |
+ + public_base_class_field = 42;
|
| |
+ }
|
| |
+
|
| |
+ public void action () {
|
| |
+ --
|
| |
+ 2.33.0.113.g6c40894d24
|
| |
+
|
| |