From: hrxi Date: Wed, 2 Aug 2023 11:14:37 +0000 (+0200) Subject: codegen: Don't emit casts in static field initializers X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a2b72120b620146daa9deb4a3fb998b6b8d27616;p=thirdparty%2Fvala.git codegen: Don't emit casts in static field initializers Found by -std=c99 -pedantic-errors Fixes https://gitlab.gnome.org/GNOME/vala/issues/1459 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 2f0ea22d8..f3a48a055 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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); diff --git a/tests/Makefile.am b/tests/Makefile.am index 54456253a..00ecce086 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..bf42508d6 --- /dev/null +++ b/tests/structs/struct-static-field-initializer-3.c-expected @@ -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 + +#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 index 000000000..eb6e0cd9a --- /dev/null +++ b/tests/structs/struct-static-field-initializer-3.vala @@ -0,0 +1,5 @@ +Once global; + +void main () { + Once local; +}