tkashkin / GameHub

All your games in one place
https://tkashkin.github.io/projects/gamehub
GNU General Public License v3.0
2.23k stars 129 forks source link

Fails to build with vala >= `0.54.4` #601

Closed Lucki closed 2 years ago

Lucki commented 2 years ago
Expected behavior

GameHub compiles correctly with the current vala version.

Actual behavior

The build fails with:

[50/174] Compiling C object src/com.github.tkashkin.gamehub.p/meson-generated_data_Runnable.c.o
FAILED: src/com.github.tkashkin.gamehub.p/meson-generated_data_Runnable.c.o 
ccache cc -Isrc/com.github.tkashkin.gamehub.p -Isrc -I../src -Idata -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/harfbuzz -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/cairo -I/usr/include/lzo -I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cloudproviders -I/usr/include/json-glib-1.0 -I/usr/include/gee-0.8 -I/usr/include/libxml2 -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -I/usr/include/at-spi-2.0 -I/usr/include/libsoup-2.4 -I/usr/include/webkitgtk-4.0 -I/usr/include/libmanette -fdiagnostics-color=always -D_FILE_OFFSET_BITS=64 -w -g -O0 '-DGETTEXT_PACKAGE="com.github.tkashkin.gamehub"' -march=native -O2 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -g -fvar-tracking-assignments -fdebug-prefix-map=/build/gamehub/src=/usr/src/debug -O0 -pthread -MD -MQ src/com.github.tkashkin.gamehub.p/meson-generated_data_Runnable.c.o -MF src/com.github.tkashkin.gamehub.p/meson-generated_data_Runnable.c.o.d -o src/com.github.tkashkin.gamehub.p/meson-generated_data_Runnable.c.o -c src/com.github.tkashkin.gamehub.p/data/Runnable.c
../src/data/Runnable.vala: In function ‘game_hub_data_runnable_real_is_supported’:
../src/data/Runnable.vala:59:64: error: lvalue required as unary ‘&’ operand
   59 |                         platform = platform ?? Platform.CURRENT;
      |                                                                ^
Steps to reproduce
  1. Install vala in version 0.54.4 or greater.
  2. Make sure ninja is aware of changed files so an actual rebuild is triggered.
  3. Try to compile the current dev branch.
  4. Observe the error mentioned above.
Version and environment
- GameHub
    Version: 0.16.1-aa097f4-
    Branch:  
- Environment
    Distro:  Arch Linux
    DE:      GNOME
    GTK:     3.24.30
tkashkin commented 2 years ago

This looks like a Vala compiler bug. I'll compare the output with an older valac version and report this to Vala devs if I can reproduce this bug.

Vala source code ```vala public enum Platform { LINUX, WINDOWS, MACOS, EMULATED; public const Platform[] PLATFORMS = { Platform.LINUX, Platform.WINDOWS, Platform.MACOS, Platform.EMULATED }; #if OS_LINUX public const Platform CURRENT = Platform.LINUX; #elif OS_WINDOWS public const Platform CURRENT = Platform.WINDOWS; #elif OS_MACOS public const Platform CURRENT = Platform.MACOS; #endif } ``` ```vala public virtual bool is_supported(Platform? platform=null, bool with_compat=true) { platform = platform ?? Platform.CURRENT; // ... ```
Vala 0.54.5 on Fedora rawhide ```c typedef enum { GAME_HUB_DATA_PLATFORM_LINUX, GAME_HUB_DATA_PLATFORM_WINDOWS, GAME_HUB_DATA_PLATFORM_MACOS, GAME_HUB_DATA_PLATFORM_EMULATED } GameHubDataPlatform; #define GAME_HUB_DATA_PLATFORM_CURRENT GAME_HUB_DATA_PLATFORM_LINUX static GameHubDataPlatform* _game_hub_data_platform_dup (GameHubDataPlatform* self) { GameHubDataPlatform* dup = g_new0 (GameHubDataPlatform, 1); memcpy (dup, self, sizeof (GameHubDataPlatform)); return dup; } static gpointer __game_hub_data_platform_dup0 (gpointer self) // typedef void* gpointer; { return self ? _game_hub_data_platform_dup (self) : NULL; } ``` ```c static gboolean game_hub_data_runnable_real_is_supported (GameHubDataRunnable* self, GameHubDataPlatform* platform, gboolean with_compat) { GameHubDataPlatform* _tmp0_ = NULL; GameHubDataPlatform* _tmp1_ = __game_hub_data_platform_dup0 (platform); // ... _tmp0_ = _tmp1_; if (_tmp0_ == NULL) { GameHubDataPlatform* _tmp2_ = __game_hub_data_platform_dup0 (&GAME_HUB_DATA_PLATFORM_CURRENT); _g_free0 (_tmp0_); _tmp0_ = _tmp2_; } platform = _tmp0_; // ... ```
tkashkin commented 2 years ago

It also doesn't build with Vala 0.48.20. I guess the problem was backported to the Vala LTS branch.

@Lucki do you remember the last Vala version it built correctly with? Can you easily rollback to that version, verify if it works, and see what's different?

Lucki commented 2 years ago

do you remember the last Vala version it built correctly with?

Yes, I've tested that, it's 0.54.3.

Can you easily rollback to that version, verify if it works, and see what's different?

0.54.3 ~~~ C static gboolean game_hub_data_runnable_real_is_supported (GameHubDataRunnable* self, GameHubDataPlatform* platform, gboolean with_compat) { GameHubDataPlatform* _tmp0_ = NULL; GameHubDataPlatform* _tmp1_; gboolean _tmp4_ = FALSE; gboolean _tmp5_ = FALSE; GeeArrayList* _tmp6_; GameHubDataCompatTool** _tmp11_; gint _tmp11__length1; gboolean result = FALSE; #line 59 "../src/data/Runnable.vala" _tmp1_ = __game_hub_data_platform_dup0 (platform); #line 59 "../src/data/Runnable.vala" _tmp0_ = _tmp1_; #line 59 "../src/data/Runnable.vala" if (_tmp0_ == NULL) { #line 1988 "Runnable.c" GameHubDataPlatform _tmp2_; GameHubDataPlatform* _tmp3_; #line 59 "../src/data/Runnable.vala" _tmp2_ = GAME_HUB_DATA_PLATFORM_CURRENT; #line 59 "../src/data/Runnable.vala" _tmp3_ = __game_hub_data_platform_dup0 (&_tmp2_); #line 59 "../src/data/Runnable.vala" _g_free0 (_tmp0_); #line 59 "../src/data/Runnable.vala" _tmp0_ = _tmp3_; #line 1999 "Runnable.c" } #line 59 "../src/data/Runnable.vala" platform = _tmp0_; #line 60 "../src/data/Runnable.vala" _tmp6_ = self->priv->_platforms; #line 60 "../src/data/Runnable.vala" if (_tmp6_ == NULL) { #line 60 "../src/data/Runnable.vala" _tmp5_ = TRUE; #line 2009 "Runnable.c" } else { GeeArrayList* _tmp7_; gint _tmp8_; gint _tmp9_; #line 60 "../src/data/Runnable.vala" _tmp7_ = self->priv->_platforms; #line 60 "../src/data/Runnable.vala" _tmp8_ = gee_abstract_collection_get_size ((GeeAbstractCollection*) _tmp7_); #line 60 "../src/data/Runnable.vala" _tmp9_ = _tmp8_; #line 60 "../src/data/Runnable.vala" _tmp5_ = _tmp9_ == 0; #line 2022 "Runnable.c" } #line 60 "../src/data/Runnable.vala" if (_tmp5_) { #line 60 "../src/data/Runnable.vala" _tmp4_ = TRUE; #line 2028 "Runnable.c" } else { GeeArrayList* _tmp10_; #line 60 "../src/data/Runnable.vala" _tmp10_ = self->priv->_platforms; #line 60 "../src/data/Runnable.vala" _tmp4_ = gee_abstract_collection_contains ((GeeAbstractCollection*) _tmp10_, (gpointer) ((gintptr) (*platform))); #line 2035 "Runnable.c" } #line 60 "../src/data/Runnable.vala" if (_tmp4_) { #line 60 "../src/data/Runnable.vala" result = TRUE; #line 60 "../src/data/Runnable.vala" _g_free0 (_tmp0_); #line 60 "../src/data/Runnable.vala" return result; #line 2045 "Runnable.c" } #line 61 "../src/data/Runnable.vala" if (!with_compat) { #line 61 "../src/data/Runnable.vala" result = FALSE; #line 61 "../src/data/Runnable.vala" _g_free0 (_tmp0_); #line 61 "../src/data/Runnable.vala" return result; #line 2055 "Runnable.c" } #line 62 "../src/data/Runnable.vala" _tmp11_ = game_hub_data_CompatTools; #line 62 "../src/data/Runnable.vala" _tmp11__length1 = game_hub_data_CompatTools_length1; #line 2061 "Runnable.c" { GameHubDataCompatTool** tool_collection = NULL; gint tool_collection_length1 = 0; gint _tool_collection_size_ = 0; gint tool_it = 0; #line 62 "../src/data/Runnable.vala" tool_collection = _tmp11_; #line 62 "../src/data/Runnable.vala" tool_collection_length1 = _tmp11__length1; #line 62 "../src/data/Runnable.vala" for (tool_it = 0; tool_it < tool_collection_length1; tool_it = tool_it + 1) { #line 2073 "Runnable.c" GameHubDataCompatTool* _tmp12_; GameHubDataCompatTool* tool = NULL; #line 62 "../src/data/Runnable.vala" _tmp12_ = _g_object_ref0 (tool_collection[tool_it]); #line 62 "../src/data/Runnable.vala" tool = _tmp12_; #line 2080 "Runnable.c" { GameHubDataCompatTool* _tmp13_; #line 64 "../src/data/Runnable.vala" _tmp13_ = tool; #line 64 "../src/data/Runnable.vala" if (game_hub_data_compat_tool_can_run (_tmp13_, self)) { #line 64 "../src/data/Runnable.vala" result = TRUE; #line 64 "../src/data/Runnable.vala" _g_object_unref0 (tool); #line 64 "../src/data/Runnable.vala" _g_free0 (_tmp0_); #line 64 "../src/data/Runnable.vala" return result; #line 2095 "Runnable.c" } #line 62 "../src/data/Runnable.vala" _g_object_unref0 (tool); #line 2099 "Runnable.c" } } } #line 66 "../src/data/Runnable.vala" result = FALSE; #line 66 "../src/data/Runnable.vala" _g_free0 (_tmp0_); #line 66 "../src/data/Runnable.vala" return result; #line 2109 "Runnable.c" } ~~~
0.54.5 ~~~ C static gboolean game_hub_data_runnable_real_is_supported (GameHubDataRunnable* self, GameHubDataPlatform* platform, gboolean with_compat) { GameHubDataPlatform* _tmp0_ = NULL; GameHubDataPlatform* _tmp1_; gboolean _tmp3_ = FALSE; gboolean _tmp4_ = FALSE; GeeArrayList* _tmp5_; GameHubDataCompatTool** _tmp10_; gint _tmp10__length1; gboolean result = FALSE; #line 59 "../src/data/Runnable.vala" _tmp1_ = __game_hub_data_platform_dup0 (platform); #line 59 "../src/data/Runnable.vala" _tmp0_ = _tmp1_; #line 59 "../src/data/Runnable.vala" if (_tmp0_ == NULL) { #line 1988 "Runnable.c" GameHubDataPlatform* _tmp2_; #line 59 "../src/data/Runnable.vala" _tmp2_ = __game_hub_data_platform_dup0 (&GAME_HUB_DATA_PLATFORM_CURRENT); #line 59 "../src/data/Runnable.vala" _g_free0 (_tmp0_); #line 59 "../src/data/Runnable.vala" _tmp0_ = _tmp2_; #line 1996 "Runnable.c" } #line 59 "../src/data/Runnable.vala" platform = _tmp0_; #line 60 "../src/data/Runnable.vala" _tmp5_ = self->priv->_platforms; #line 60 "../src/data/Runnable.vala" if (_tmp5_ == NULL) { #line 60 "../src/data/Runnable.vala" _tmp4_ = TRUE; #line 2006 "Runnable.c" } else { GeeArrayList* _tmp6_; gint _tmp7_; gint _tmp8_; #line 60 "../src/data/Runnable.vala" _tmp6_ = self->priv->_platforms; #line 60 "../src/data/Runnable.vala" _tmp7_ = gee_abstract_collection_get_size ((GeeAbstractCollection*) _tmp6_); #line 60 "../src/data/Runnable.vala" _tmp8_ = _tmp7_; #line 60 "../src/data/Runnable.vala" _tmp4_ = _tmp8_ == 0; #line 2019 "Runnable.c" } #line 60 "../src/data/Runnable.vala" if (_tmp4_) { #line 60 "../src/data/Runnable.vala" _tmp3_ = TRUE; #line 2025 "Runnable.c" } else { GeeArrayList* _tmp9_; #line 60 "../src/data/Runnable.vala" _tmp9_ = self->priv->_platforms; #line 60 "../src/data/Runnable.vala" _tmp3_ = gee_abstract_collection_contains ((GeeAbstractCollection*) _tmp9_, (gpointer) ((gintptr) (*platform))); #line 2032 "Runnable.c" } #line 60 "../src/data/Runnable.vala" if (_tmp3_) { #line 60 "../src/data/Runnable.vala" result = TRUE; #line 60 "../src/data/Runnable.vala" _g_free0 (_tmp0_); #line 60 "../src/data/Runnable.vala" return result; #line 2042 "Runnable.c" } #line 61 "../src/data/Runnable.vala" if (!with_compat) { #line 61 "../src/data/Runnable.vala" result = FALSE; #line 61 "../src/data/Runnable.vala" _g_free0 (_tmp0_); #line 61 "../src/data/Runnable.vala" return result; #line 2052 "Runnable.c" } #line 62 "../src/data/Runnable.vala" _tmp10_ = game_hub_data_CompatTools; #line 62 "../src/data/Runnable.vala" _tmp10__length1 = game_hub_data_CompatTools_length1; #line 2058 "Runnable.c" { GameHubDataCompatTool** tool_collection = NULL; gint tool_collection_length1 = 0; gint _tool_collection_size_ = 0; gint tool_it = 0; #line 62 "../src/data/Runnable.vala" tool_collection = _tmp10_; #line 62 "../src/data/Runnable.vala" tool_collection_length1 = _tmp10__length1; #line 62 "../src/data/Runnable.vala" for (tool_it = 0; tool_it < tool_collection_length1; tool_it = tool_it + 1) { #line 2070 "Runnable.c" GameHubDataCompatTool* _tmp11_; GameHubDataCompatTool* tool = NULL; #line 62 "../src/data/Runnable.vala" _tmp11_ = _g_object_ref0 (tool_collection[tool_it]); #line 62 "../src/data/Runnable.vala" tool = _tmp11_; #line 2077 "Runnable.c" { GameHubDataCompatTool* _tmp12_; #line 64 "../src/data/Runnable.vala" _tmp12_ = tool; #line 64 "../src/data/Runnable.vala" if (game_hub_data_compat_tool_can_run (_tmp12_, self)) { #line 64 "../src/data/Runnable.vala" result = TRUE; #line 64 "../src/data/Runnable.vala" _g_object_unref0 (tool); #line 64 "../src/data/Runnable.vala" _g_free0 (_tmp0_); #line 64 "../src/data/Runnable.vala" return result; #line 2092 "Runnable.c" } #line 62 "../src/data/Runnable.vala" _g_object_unref0 (tool); #line 2096 "Runnable.c" } } } #line 66 "../src/data/Runnable.vala" result = FALSE; #line 66 "../src/data/Runnable.vala" _g_free0 (_tmp0_); #line 66 "../src/data/Runnable.vala" return result; #line 2106 "Runnable.c" } ~~~
tkashkin commented 2 years ago

So in previous versions it creates a temporary variable, but in >= 0.54.4 it inlines GAME_HUB_DATA_PLATFORM_CURRENT while trying to pass a pointer to it using the & operator. GAME_HUB_DATA_PLATFORM_CURRENT expands into GAME_HUB_DATA_PLATFORM_LINUX which is an enum constant, so & here becomes invalid.

I'll try to write a simplified test case later and report this to Vala devs, or you can do it yourself now if you want.

tkashkin commented 2 years ago

I've reported this to the Vala issue tracker: https://gitlab.gnome.org/GNOME/vala/-/issues/1268

Possible workaround: make Runnable.is_supported accept non-nullable Platform and pass Platform.CURRENT instead of null everywhere.

tkashkin commented 2 years ago

It seems the issue is already fixed and fix should be in the next Vala release.

Lucki commented 2 years ago

Thanks for looking into it, guess it just was bad timing then.

Lucki commented 2 years ago

Fixed by vala 0.54.6