]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add missing cast to access base-class members in class/static ctor
authorRico Tzschichholz <ricotz@ubuntu.com>
Tue, 31 Aug 2021 14:28:05 +0000 (16:28 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 31 Aug 2021 14:37:32 +0000 (16:37 +0200)
Regression of 9cbd53b8d79aa4c394ddf49e766f2c15fc476906

Fixes https://gitlab.gnome.org/GNOME/vala/issues/1221

codegen/valaccodebasemodule.vala
tests/objects/fields.c-expected
tests/objects/fields.vala

index 54fc3e184f5fea758cbbb8dfede1257cf39e0cfe..f7321b72a2542729a29cc2f2b1f6dd51b737c35d 100644 (file)
@@ -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;
        }
index 6d739196891b3cc409a5ab9d47c61a9b1f95554e..03828580ceb8776526b5b24d1af6509517311998 100644 (file)
@@ -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
index 0872045bb6c42aa933cf344595119f7638060e91..e14572bd9a86911edb9dc0c3b3129599fa763802 100644 (file)
@@ -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 () {