From 45e4b8e360c55f4ce9a72c6b9733bb6161548179 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Mon, 5 Feb 2024 13:14:50 +0100 Subject: [PATCH 1/4] CI: Add Clang on Windows tests CI: Remove Linux Clang CI https://github.com/actions/runner-images/issues/8659 --- .github/workflows/build.yml | 74 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6ba1455..a91e514 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,39 +16,45 @@ jobs: fail-fast: false matrix: confs: - - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: x86, mode: debug, test: true, } - - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: x86, mode: releasedbg, test: true, } - - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: x64, mode: debug, test: true, } - - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: x64, mode: releasedbg, test: true, } - - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: arm64, mode: debug, test: false, } - - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: arm64, mode: releasedbg, test: false, } - - { name: MinGW, runner: windows-latest, shell: 'msys2 {0}', plat: mingw, arch: i686, mode: debug, test: true, msystem: mingw32 } - - { name: MinGW, runner: windows-latest, shell: 'msys2 {0}', plat: mingw, arch: i686, mode: releasedbg, test: true, msystem: mingw32 } - - { name: MinGW, runner: windows-latest, shell: 'msys2 {0}', plat: mingw, arch: x86_64, mode: debug, test: true, msystem: mingw64 } - - { name: MinGW, runner: windows-latest, shell: 'msys2 {0}', plat: mingw, arch: x86_64, mode: releasedbg, test: true, msystem: mingw64 } - - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: x86_64, mode: debug, test: true, } - - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: x86_64, mode: debug, test: true, config: --asan=y } - - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: x86_64, mode: debug, test: true, config: --lsan=y } - - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: x86_64, mode: debug, test: true, config: --tsan=y } - - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: x86_64, mode: releasedbg, test: true, } - - { name: Android NDK 25c, runner: ubuntu-latest, shell: bash, plat: android, arch: armeabi-v7a, mode: debug, test: false, ndk_ver: 25c, ndk_sdkver: 28 } - - { name: Android NDK 25c, runner: ubuntu-latest, shell: bash, plat: android, arch: armeabi-v7a, mode: releasedbg, test: false, ndk_ver: 25c, ndk_sdkver: 28 } - - { name: Android NDK 25c, runner: ubuntu-latest, shell: bash, plat: android, arch: arm64-v8a, mode: debug, test: false, ndk_ver: 25c, ndk_sdkver: 28 } - - { name: Android NDK 25c, runner: ubuntu-latest, shell: bash, plat: android, arch: arm64-v8a, mode: releasedbg, test: false, ndk_ver: 25c, ndk_sdkver: 28 } - - { name: Android NDK 26b, runner: ubuntu-latest, shell: bash, plat: android, arch: armeabi-v7a, mode: debug, test: false, ndk_ver: 26b, ndk_sdkver: 28 } - - { name: Android NDK 26b, runner: ubuntu-latest, shell: bash, plat: android, arch: armeabi-v7a, mode: releasedbg, test: false, ndk_ver: 26b, ndk_sdkver: 28 } - - { name: Android NDK 26b, runner: ubuntu-latest, shell: bash, plat: android, arch: arm64-v8a, mode: debug, test: false, ndk_ver: 26b, ndk_sdkver: 28 } - - { name: Android NDK 26b, runner: ubuntu-latest, shell: bash, plat: android, arch: arm64-v8a, mode: releasedbg, test: false, ndk_ver: 26b, ndk_sdkver: 28 } - - { name: macOS, runner: macos-latest, shell: bash, plat: macosx, arch: x86_64, mode: debug, test: true, } - - { name: macOS, runner: macos-latest, shell: bash, plat: macosx, arch: x86_64, mode: releasedbg, test: true, } - - { name: macOS, runner: macos-latest, shell: bash, plat: macosx, arch: arm64, mode: debug, test: false, } - - { name: macOS, runner: macos-latest, shell: bash, plat: macosx, arch: arm64, mode: releasedbg, test: false, } - - { name: iOS, runner: macos-latest, shell: bash, plat: iphoneos, arch: arm64, mode: debug, test: false, } - - { name: iOS, runner: macos-latest, shell: bash, plat: iphoneos, arch: arm64, mode: releasedbg, test: false, } - - { name: Emscripten, runner: ubuntu-latest, shell: bash, plat: wasm, arch: wasm32, mode: debug, test: false, } - - { name: Emscripten, runner: ubuntu-latest, shell: bash, plat: wasm, arch: wasm32, mode: releasedbg, test: false, } - - { name: Emscripten, runner: ubuntu-latest, shell: bash, plat: wasm, arch: wasm64, mode: debug, test: false, } - - { name: Emscripten, runner: ubuntu-latest, shell: bash, plat: wasm, arch: wasm64, mode: releasedbg, test: false, } + - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: x86, mode: debug, test: true, } + - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: x86, mode: releasedbg, test: true, } + - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: x64, mode: debug, test: true, } + - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: x64, mode: releasedbg, test: true, } + - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: arm64, mode: debug, test: false, } + - { name: Windows, runner: windows-latest, shell: pwsh, plat: windows, arch: arm64, mode: releasedbg, test: false, } + - { name: Windows (Clang), runner: windows-latest, shell: pwsh, plat: windows, arch: x86, mode: debug, test: true, config: --toolchain=clang, cache_key: -clang } + - { name: Windows (Clang), runner: windows-latest, shell: pwsh, plat: windows, arch: x86, mode: releasedbg, test: true, config: --toolchain=clang, cache_key: -clang } + - { name: Windows (Clang), runner: windows-latest, shell: pwsh, plat: windows, arch: x64, mode: debug, test: true, config: --toolchain=clang, cache_key: -clang } + - { name: Windows (Clang), runner: windows-latest, shell: pwsh, plat: windows, arch: x64, mode: releasedbg, test: true, config: --toolchain=clang, cache_key: -clang } + - { name: MinGW, runner: windows-latest, shell: 'msys2 {0}', plat: mingw, arch: i686, mode: debug, test: true, msystem: mingw32 } + - { name: MinGW, runner: windows-latest, shell: 'msys2 {0}', plat: mingw, arch: i686, mode: releasedbg, test: true, msystem: mingw32 } + - { name: MinGW, runner: windows-latest, shell: 'msys2 {0}', plat: mingw, arch: x86_64, mode: debug, test: true, msystem: mingw64 } + - { name: MinGW, runner: windows-latest, shell: 'msys2 {0}', plat: mingw, arch: x86_64, mode: releasedbg, test: true, msystem: mingw64 } + - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: x86_64, mode: debug, test: true, } + - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: x86_64, mode: debug, test: true, config: --asan=y, cache_key: -asan } + - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: x86_64, mode: debug, test: true, config: --lsan=y } + - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: x86_64, mode: debug, test: true, config: --tsan=y } + - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: x86_64, mode: releasedbg, test: true, } + - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: arm64-v8a, mode: debug, test: true, } + - { name: Linux, runner: ubuntu-latest, shell: bash, plat: linux, arch: arm64-v8a, mode: releasedbg, test: true, } + - { name: Android NDK 25c, runner: ubuntu-latest, shell: bash, plat: android, arch: armeabi-v7a, mode: debug, test: false, ndk_ver: 25c, ndk_sdkver: 28 } + - { name: Android NDK 25c, runner: ubuntu-latest, shell: bash, plat: android, arch: armeabi-v7a, mode: releasedbg, test: false, ndk_ver: 25c, ndk_sdkver: 28 } + - { name: Android NDK 25c, runner: ubuntu-latest, shell: bash, plat: android, arch: arm64-v8a, mode: debug, test: false, ndk_ver: 25c, ndk_sdkver: 28 } + - { name: Android NDK 25c, runner: ubuntu-latest, shell: bash, plat: android, arch: arm64-v8a, mode: releasedbg, test: false, ndk_ver: 25c, ndk_sdkver: 28 } + - { name: Android NDK 26b, runner: ubuntu-latest, shell: bash, plat: android, arch: armeabi-v7a, mode: debug, test: false, ndk_ver: 26b, ndk_sdkver: 28 } + - { name: Android NDK 26b, runner: ubuntu-latest, shell: bash, plat: android, arch: armeabi-v7a, mode: releasedbg, test: false, ndk_ver: 26b, ndk_sdkver: 28 } + - { name: Android NDK 26b, runner: ubuntu-latest, shell: bash, plat: android, arch: arm64-v8a, mode: debug, test: false, ndk_ver: 26b, ndk_sdkver: 28 } + - { name: Android NDK 26b, runner: ubuntu-latest, shell: bash, plat: android, arch: arm64-v8a, mode: releasedbg, test: false, ndk_ver: 26b, ndk_sdkver: 28 } + - { name: macOS, runner: macos-latest, shell: bash, plat: macosx, arch: x86_64, mode: debug, test: true, } + - { name: macOS, runner: macos-latest, shell: bash, plat: macosx, arch: x86_64, mode: releasedbg, test: true, } + - { name: macOS, runner: macos-latest, shell: bash, plat: macosx, arch: arm64, mode: debug, test: false, } + - { name: macOS, runner: macos-latest, shell: bash, plat: macosx, arch: arm64, mode: releasedbg, test: false, } + - { name: iOS, runner: macos-latest, shell: bash, plat: iphoneos, arch: arm64, mode: debug, test: false, } + - { name: iOS, runner: macos-latest, shell: bash, plat: iphoneos, arch: arm64, mode: releasedbg, test: false, } + - { name: Emscripten, runner: ubuntu-latest, shell: bash, plat: wasm, arch: wasm32, mode: debug, test: false, } + - { name: Emscripten, runner: ubuntu-latest, shell: bash, plat: wasm, arch: wasm32, mode: releasedbg, test: false, } + - { name: Emscripten, runner: ubuntu-latest, shell: bash, plat: wasm, arch: wasm64, mode: debug, test: false, } + - { name: Emscripten, runner: ubuntu-latest, shell: bash, plat: wasm, arch: wasm64, mode: releasedbg, test: false, } cxxver: [cxx17, cxx20, cxxlatest] defaults: @@ -122,7 +128,7 @@ jobs: uses: actions/cache/restore@v4 with: path: ${{ env.XMAKE_GLOBALDIR }}/.xmake/packages - key: ${{ matrix.confs.plat }}-${{ matrix.confs.arch }}-${{ matrix.confs.mode }}-${{ steps.dep_hash.outputs.hash }}-W${{ steps.cache_key.outputs.key }} + key: ${{ matrix.confs.plat }}-${{ matrix.confs.arch }}-${{ matrix.confs.mode }}-${{ steps.dep_hash.outputs.hash }}${{ matrix.confs.cache_key }}-W${{ steps.cache_key.outputs.key }} # Setup compilation mode and install project dependencies - name: Configure xmake and install dependencies From 5880c8e12d94db27e96cc21425542d6252fb7d55 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Mon, 5 Feb 2024 13:46:28 +0100 Subject: [PATCH 2/4] FunctionRef: Rework it to make it compile on Clang on Windows Try to bypass "error: cannot compile this forwarded non-trivially copyable parameter yet" --- include/NazaraUtils/FunctionRef.hpp | 2 ++ include/NazaraUtils/FunctionRef.inl | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/include/NazaraUtils/FunctionRef.hpp b/include/NazaraUtils/FunctionRef.hpp index ad95fd0..0b0b99c 100644 --- a/include/NazaraUtils/FunctionRef.hpp +++ b/include/NazaraUtils/FunctionRef.hpp @@ -35,6 +35,8 @@ namespace Nz FunctionRef& operator=(FunctionRef&&) noexcept = default; private: + template static Ret Call(void* functor, Args... args); + using Callback = Ret(*)(void* functor, Args...); Callback m_callback; diff --git a/include/NazaraUtils/FunctionRef.inl b/include/NazaraUtils/FunctionRef.inl index b7e8ba1..a53ad62 100644 --- a/include/NazaraUtils/FunctionRef.inl +++ b/include/NazaraUtils/FunctionRef.inl @@ -19,10 +19,7 @@ namespace Nz FunctionRef::FunctionRef(F&& f) noexcept { m_functor = reinterpret_cast(std::addressof(f)); - m_callback = [](void* functor, Args... args) -> Ret - { - return std::invoke(*reinterpret_cast(functor), std::forward(args)...); - }; + m_callback = &Call; } template @@ -37,4 +34,11 @@ namespace Nz { return m_functor != nullptr; } + + template + template + Ret FunctionRef::Call(void* functor, Args... args) + { + return std::invoke(*reinterpret_cast(functor), std::forward(args)...); + } } From 07db9fd01d48a9c50fceafd19efdd1a44a646d65 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Mon, 5 Feb 2024 14:19:08 +0100 Subject: [PATCH 3/4] Fix alloca support on Clang on Windows Revert "Fix alloca support on Clang on Windows" This reverts commit d09fd9eab6b0383c898883989554e1bb45174556. Update MemoryHelper.hpp --- include/NazaraUtils/MemoryHelper.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/NazaraUtils/MemoryHelper.hpp b/include/NazaraUtils/MemoryHelper.hpp index 1c8aab7..f765ce0 100644 --- a/include/NazaraUtils/MemoryHelper.hpp +++ b/include/NazaraUtils/MemoryHelper.hpp @@ -7,7 +7,9 @@ #ifndef NAZARAUTILS_MEMORYHELPER_HPP #define NAZARAUTILS_MEMORYHELPER_HPP -#if defined(NAZARA_COMPILER_MSVC) || defined(NAZARA_COMPILER_MINGW) +#include + +#if defined(NAZARA_PLATFORM_WINDOWS) // MSVC / MinGW / Clang on Windows #include From 139485715b68c38ccc4789171e413d9057d3de09 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Mon, 5 Feb 2024 14:49:09 +0100 Subject: [PATCH 4/4] Try something to fix FunctionRef crash with Clang --- include/NazaraUtils/FunctionRef.inl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/NazaraUtils/FunctionRef.inl b/include/NazaraUtils/FunctionRef.inl index a53ad62..e431a5a 100644 --- a/include/NazaraUtils/FunctionRef.inl +++ b/include/NazaraUtils/FunctionRef.inl @@ -18,8 +18,8 @@ namespace Nz template FunctionRef::FunctionRef(F&& f) noexcept { - m_functor = reinterpret_cast(std::addressof(f)); - m_callback = &Call; + m_functor = const_cast(reinterpret_cast(std::addressof(f))); + m_callback = &Call>; } template