]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Don't emit casts in static field initializers
authorhrxi <hrrrxi@gmail.com>
Wed, 2 Aug 2023 11:14:37 +0000 (13:14 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 3 Aug 2023 10:16:25 +0000 (12:16 +0200)
Found by -std=c99 -pedantic-errors

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

codegen/valaccodebasemodule.vala
tests/Makefile.am
tests/structs/struct-static-field-initializer-3.c-expected [new file with mode: 0644]
tests/structs/struct-static-field-initializer-3.vala [new file with mode: 0644]

index 2f0ea22d8b9e0e33b85bf88db19f504661a8f9f7..f3a48a0551aff175ce40816241e05b6fc8b417d2 100644 (file)
@@ -1346,7 +1346,12 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
                        if (!f.external) {
                                var var_decl = new CCodeVariableDeclarator (get_ccode_name (f), null, get_ccode_declarator_suffix (f.variable_type));
-                               var_decl.initializer = default_value_for_type (f.variable_type, true);
+                               var initializer = default_value_for_type (f.variable_type, true);
+                               // error: initializer element is not constant (-std=c99 -pedantic-errors)
+                               while (initializer is CCodeCastExpression) {
+                                       initializer = ((CCodeCastExpression) initializer).inner;
+                               }
+                               var_decl.initializer = initializer;
 
                                if (class_init_context != null) {
                                        push_context (class_init_context);
index 54456253a11a57715f693b02fcc90f0b8e5e0854..00ecce0869846848fcb47140c10bc6b344f42fb4 100644 (file)
@@ -401,6 +401,7 @@ TESTS = \
        structs/struct-no-gtype-inherit.vala \
        structs/struct-static-field-initializer.vala \
        structs/struct-static-field-initializer-2.test \
+       structs/struct-static-field-initializer-3.vala \
        structs/struct-static-property-initializer.test \
        structs/structs.vala \
        structs/constructor-params-array.vala \
diff --git a/tests/structs/struct-static-field-initializer-3.c-expected b/tests/structs/struct-static-field-initializer-3.c-expected
new file mode 100644 (file)
index 0000000..bf42508
--- /dev/null
@@ -0,0 +1,34 @@
+/* structs_struct_static_field_initializer_3.c generated by valac, the Vala compiler
+ * generated from structs_struct_static_field_initializer_3.vala, do not modify */
+
+#include <glib.h>
+
+#if !defined(VALA_EXTERN)
+#if defined(_WIN32) || defined(__CYGWIN__)
+#define VALA_EXTERN __declspec(dllexport) extern
+#elif __GNUC__ >= 4
+#define VALA_EXTERN __attribute__((visibility("default"))) extern
+#else
+#define VALA_EXTERN extern
+#endif
+#endif
+
+VALA_EXTERN GOnce global;
+GOnce global = G_ONCE_INIT;
+
+static void _vala_main (void);
+
+static void
+_vala_main (void)
+{
+       GOnce local = (GOnce) G_ONCE_INIT;
+}
+
+int
+main (int argc,
+      char ** argv)
+{
+       _vala_main ();
+       return 0;
+}
+
diff --git a/tests/structs/struct-static-field-initializer-3.vala b/tests/structs/struct-static-field-initializer-3.vala
new file mode 100644 (file)
index 0000000..eb6e0cd
--- /dev/null
@@ -0,0 +1,5 @@
+Once global;
+
+void main () {
+       Once local;
+}