From c0121583cee85656862516e689f8b63555a0ff20 Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz 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