diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 665a5bca1..d5b7dbb10 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,25 +14,25 @@ jobs: strategy: fail-fast: false matrix: - os: [windows-latest, windows-2019] + os: [windows-latest, windows-2022] toolkit: [v143, v142, v141, v140] std: [98, 11, 14, 17, 20] config: [Debug, Release] exclude: - - os: windows-2019 + - os: windows-2022 toolkit: v143 - - os: windows-2019 + - os: windows-2022 toolkit: v142 - os: windows-latest toolkit: v140 - os: windows-latest toolkit: v141 - - os: windows-2019 + - os: windows-2022 std: 20 - - os: windows-2019 + - os: windows-2022 toolkit: v140 std: 17 - - os: windows-2019 + - os: windows-2022 toolkit: v140 std: 14 @@ -49,7 +49,10 @@ jobs: ls ${{ github.workspace }} - run: echo "🍏 This job's status is ${{ job.status }}." - name: CMake Version - run: cmake --version + uses: lukka/get-cmake@latest + with: + cmakeVersion: 3.22.1 + - run: cmake --version - name: Run with automagic detection run: | @@ -110,11 +113,11 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, ubuntu-20.04] + os: [ubuntu-latest, ubuntu-22.04] std: [98, 11, 14, 17, 20] config: [Debug, Release] exclude: - - os: ubuntu-20.04 + - os: ubuntu-22.04 std: 20 - os: ubuntu-latest std: 98 @@ -132,7 +135,10 @@ jobs: ls ${{ github.workspace }} - run: echo "🍏 This job's status is ${{ job.status }}." - name: CMake Version - run: cmake --version + uses: lukka/get-cmake@latest + with: + cmakeVersion: 3.22.1 + - run: cmake --version - name: Run with automagic detection run: | cmake -S. -B ./build_auto -DGLM_BUILD_TESTS=ON @@ -205,7 +211,10 @@ jobs: ls ${{ github.workspace }} - run: echo "🍏 This job's status is ${{ job.status }}." - name: CMake Version - run: cmake --version + uses: lukka/get-cmake@latest + with: + cmakeVersion: 3.22.1 + - run: cmake --version - name: Run with automagic detection run: | cmake -S. -B ./build_auto -DGLM_BUILD_TESTS=ON @@ -267,7 +276,10 @@ jobs: ls ${{ github.workspace }} - run: echo "🍏 This job's status is ${{ job.status }}." - name: CMake Version - run: cmake --version + uses: lukka/get-cmake@latest + with: + cmakeVersion: 3.22.1 + - run: cmake --version - name: Run with automagic detection run: | cmake -S. -B ./build_auto -DGLM_BUILD_TESTS=ON diff --git a/CMakeLists.txt b/CMakeLists.txt index 44b74714e..750d508f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ if(GLM_ENABLE_CXX_20) message(STATUS "GLM: Disable -Wc++98-compat warnings") add_compile_options(-Wno-c++98-compat) add_compile_options(-Wno-c++98-compat-pedantic) + add_compile_options(-Wno-switch-default) endif() if(NOT GLM_QUIET) message(STATUS "GLM: Build with C++20 features") @@ -54,6 +55,7 @@ elseif(GLM_ENABLE_CXX_17) message(STATUS "GLM: Disable -Wc++98-compat warnings") add_compile_options(-Wno-c++98-compat) add_compile_options(-Wno-c++98-compat-pedantic) + add_compile_options(-Wno-switch-default) endif() if(NOT GLM_QUIET) message(STATUS "GLM: Build with C++17 features") @@ -66,6 +68,7 @@ elseif(GLM_ENABLE_CXX_14) message(STATUS "GLM: Disable -Wc++98-compat warnings") add_compile_options(-Wno-c++98-compat) add_compile_options(-Wno-c++98-compat-pedantic) + add_compile_options(-Wno-switch-default) endif() if(NOT GLM_QUIET) message(STATUS "GLM: Build with C++14 features") @@ -78,6 +81,7 @@ elseif(GLM_ENABLE_CXX_11) message(STATUS "GLM: Disable -Wc++98-compat warnings") add_compile_options(-Wno-c++98-compat) add_compile_options(-Wno-c++98-compat-pedantic) + add_compile_options(-Wno-switch-default) endif() if(NOT GLM_QUIET) message(STATUS "GLM: Build with C++11 features") @@ -86,6 +90,9 @@ elseif(GLM_ENABLE_CXX_11) elseif(GLM_ENABLE_CXX_98) set(CMAKE_CXX_STANDARD 98) add_definitions(-DGLM_FORCE_CXX98) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wno-switch-default) + endif() if(NOT GLM_QUIET) message(STATUS "GLM: Build with C++98 features") endif() @@ -95,6 +102,7 @@ else() message(STATUS "GLM: Disable -Wc++98-compat warnings") add_compile_options(-Wno-c++98-compat) add_compile_options(-Wno-c++98-compat-pedantic) + add_compile_options(-Wno-switch-default) endif() if(NOT GLM_QUIET) message(STATUS "GLM: Build with C++ features auto detection") diff --git a/glm/detail/func_common_simd.inl b/glm/detail/func_common_simd.inl index 818bb1f56..e7f91ff53 100644 --- a/glm/detail/func_common_simd.inl +++ b/glm/detail/func_common_simd.inl @@ -545,71 +545,71 @@ namespace detail #if GLM_ARCH & GLM_ARCH_NEON_BIT namespace glm { - namespace detail { - - template - struct convert_vec3_to_vec4W0 +namespace detail { + template + struct convert_vec3_to_vec4W0 + { + GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<3, float, Q> const& a) { - GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<3, float, Q> const& a) - { - vec<4, float, Q> v; - static const uint32x4_t mask = { 0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; - v.data = vbslq_f32(mask, a.data, vdupq_n_f32(0)); - return v; - } - }; - - template - struct convert_vec4_to_vec3 { - GLM_FUNC_QUALIFIER static vec<3, float, Q> call(vec<4, float, Q> const& a) - { - vec<3, float, Q> v; - v.data = a.data; - return v; - } - }; - - template - struct compute_splat { - template - GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec call(vec const& a) - { - (void)a; - } - - template<> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec call<0>(vec const& a) - { - vec Result; - Result.data = vdupq_lane_f32(vget_low_f32(a.data), 0); - return Result; - } - - template<> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec call<1>(vec const& a) - { - vec Result; - Result.data = vdupq_lane_f32(vget_low_f32(a.data), 1); - return Result; - } - - template<> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec call<2>(vec const& a) - { - vec Result; - Result.data = vdupq_lane_f32(vget_high_f32(a.data), 0); - return Result; - } - - template<> - GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec call<3>(vec const& a) - { - vec Result; - Result.data = vdupq_lane_f32(vget_high_f32(a.data), 1); - return Result; - } + vec<4, float, Q> v; + static const uint32x4_t mask = { 0, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; + v.data = vbslq_f32(mask, a.data, vdupq_n_f32(0)); + return v; + } }; + template + struct convert_vec4_to_vec3 { + GLM_FUNC_QUALIFIER static vec<3, float, Q> call(vec<4, float, Q> const& a) + { + vec<3, float, Q> v; + v.data = a.data; + return v; + } + }; + +/* compute_splat is never called? + template + struct compute_splat { + template + GLM_FUNC_QUALIFIER static vec call(vec const& a) + { + (void)a; + } + + template<> + GLM_FUNC_QUALIFIER static vec call<0>(vec const& a) + { + vec Result; + Result.data = vdupq_lane_f32(vget_low_f32(a.data), 0); + return Result; + } + + template<> + GLM_FUNC_QUALIFIER static vec call<1>(vec const& a) + { + vec Result; + Result.data = vdupq_lane_f32(vget_low_f32(a.data), 1); + return Result; + } + + template<> + GLM_FUNC_QUALIFIER static vec call<2>(vec const& a) + { + vec Result; + Result.data = vdupq_lane_f32(vget_high_f32(a.data), 0); + return Result; + } + + template<> + GLM_FUNC_QUALIFIER static vec call<3>(vec const& a) + { + vec Result; + Result.data = vdupq_lane_f32(vget_high_f32(a.data), 1); + return Result; + } + }; +*/ }//namespace detail }//namespace glm #endif //GLM_ARCH & GLM_ARCH_NEON_BIT diff --git a/glm/gtx/io.inl b/glm/gtx/io.inl index d4ef825eb..185a6bb72 100644 --- a/glm/gtx/io.inl +++ b/glm/gtx/io.inl @@ -394,6 +394,7 @@ namespace detail switch(fmt.order) { + default: case io::column_major: { for(length_t i(0); i < rows; ++i) diff --git a/glm/simd/neon.h b/glm/simd/neon.h index 4bb7c2ed4..fc86e62d8 100644 --- a/glm/simd/neon.h +++ b/glm/simd/neon.h @@ -10,6 +10,7 @@ namespace glm { namespace neon { static inline float32x4_t dupq_lane(float32x4_t vsrc, int lane) { switch(lane) { + default: assert(false); //Unreachable code executed! #if GLM_ARCH & GLM_ARCH_ARMV8_BIT case 0: return vdupq_laneq_f32(vsrc, 0); case 1: return vdupq_laneq_f32(vsrc, 1); @@ -22,12 +23,12 @@ namespace glm { case 3: return vdupq_n_f32(vgetq_lane_f32(vsrc, 3)); #endif } - assert(false); //Unreachable code executed! return vdupq_n_f32(0.0f); } static inline float32x2_t dup_lane(float32x4_t vsrc, int lane) { switch(lane) { + default: assert(false); //Unreachable code executed! #if GLM_ARCH & GLM_ARCH_ARMV8_BIT case 0: return vdup_laneq_f32(vsrc, 0); case 1: return vdup_laneq_f32(vsrc, 1); @@ -40,84 +41,80 @@ namespace glm { case 3: return vdup_n_f32(vgetq_lane_f32(vsrc, 3)); #endif } - assert(false); //Unreachable code executed! return vdup_n_f32(0.0f); } static inline float32x4_t copy_lane(float32x4_t vdst, int dlane, float32x4_t vsrc, int slane) { #if GLM_ARCH & GLM_ARCH_ARMV8_BIT switch(dlane) { + default: case 0: switch(slane) { + default: assert(false); //Unreachable code executed! case 0: return vcopyq_laneq_f32(vdst, 0, vsrc, 0); case 1: return vcopyq_laneq_f32(vdst, 0, vsrc, 1); case 2: return vcopyq_laneq_f32(vdst, 0, vsrc, 2); case 3: return vcopyq_laneq_f32(vdst, 0, vsrc, 3); } - assert(false); //Unreachable code executed! break; case 1: switch(slane) { + default: assert(false); //Unreachable code executed! case 0: return vcopyq_laneq_f32(vdst, 1, vsrc, 0); case 1: return vcopyq_laneq_f32(vdst, 1, vsrc, 1); case 2: return vcopyq_laneq_f32(vdst, 1, vsrc, 2); case 3: return vcopyq_laneq_f32(vdst, 1, vsrc, 3); } - assert(false); //Unreachable code executed! break; case 2: switch(slane) { + default: assert(false); //Unreachable code executed! case 0: return vcopyq_laneq_f32(vdst, 2, vsrc, 0); case 1: return vcopyq_laneq_f32(vdst, 2, vsrc, 1); case 2: return vcopyq_laneq_f32(vdst, 2, vsrc, 2); case 3: return vcopyq_laneq_f32(vdst, 2, vsrc, 3); } - assert(false); //Unreachable code executed! break; case 3: switch(slane) { + default: assert(false); //Unreachable code executed! case 0: return vcopyq_laneq_f32(vdst, 3, vsrc, 0); case 1: return vcopyq_laneq_f32(vdst, 3, vsrc, 1); case 2: return vcopyq_laneq_f32(vdst, 3, vsrc, 2); case 3: return vcopyq_laneq_f32(vdst, 3, vsrc, 3); } - assert(false); //Unreachable code executed! break; } #else float l; switch(slane) { + default: assert(false); //Unreachable code executed! case 0: l = vgetq_lane_f32(vsrc, 0); break; case 1: l = vgetq_lane_f32(vsrc, 1); break; case 2: l = vgetq_lane_f32(vsrc, 2); break; case 3: l = vgetq_lane_f32(vsrc, 3); break; - default: - assert(false); //Unreachable code executed! } switch(dlane) { + default: assert(false); //Unreachable code executed! case 0: return vsetq_lane_f32(l, vdst, 0); case 1: return vsetq_lane_f32(l, vdst, 1); case 2: return vsetq_lane_f32(l, vdst, 2); case 3: return vsetq_lane_f32(l, vdst, 3); } #endif - assert(false); //Unreachable code executed! return vdupq_n_f32(0.0f); } static inline float32x4_t mul_lane(float32x4_t v, float32x4_t vlane, int lane) { #if GLM_ARCH & GLM_ARCH_ARMV8_BIT - switch(lane) { + switch(lane) { + default: assert(false); return vdupq_n_f32(0.0f); //Unreachable code executed! case 0: return vmulq_laneq_f32(v, vlane, 0); break; case 1: return vmulq_laneq_f32(v, vlane, 1); break; case 2: return vmulq_laneq_f32(v, vlane, 2); break; case 3: return vmulq_laneq_f32(v, vlane, 3); break; - default: - assert(false); //Unreachable code executed! } - assert(false); //Unreachable code executed! - return vdupq_n_f32(0.0f); #else return vmulq_f32(v, dupq_lane(vlane, lane)); #endif @@ -147,7 +144,6 @@ namespace glm { default: assert(false); //Unreachable code executed! } - assert(false); //Unreachable code executed! return vdupq_n_f32(0.0f); # undef FMADD_LANE #else diff --git a/test/gtx/gtx_integer.cpp b/test/gtx/gtx_integer.cpp index 9bc510d28..8d122b962 100644 --- a/test/gtx/gtx_integer.cpp +++ b/test/gtx/gtx_integer.cpp @@ -33,7 +33,7 @@ static int test_log2() Error += glm::abs(double(A) - B) <= 24 ? 0 : 1; assert(!Error); - std::printf("Log2(%d) error A=%d, B=%d\n", 1 << i, A, B); + std::printf("Log2(%d) error A=%u, B=%u\n", 1 << i, A, B); } std::printf("log2 error=%d\n", Error); diff --git a/test/gtx/gtx_io.cpp b/test/gtx/gtx_io.cpp index 2d3f87334..5cf32cb4c 100644 --- a/test/gtx/gtx_io.cpp +++ b/test/gtx/gtx_io.cpp @@ -51,7 +51,7 @@ namespace else if (typeid(T) == typeid(glm::mat<4, 4, U,P>)) { ostr << "mat4x4"; } else { ostr << "unknown"; } - ostr << '<' << typeid(U).name() << ',' << P << '>'; + ostr << "<" << typeid(U).name() << "," << P << ">"; return ostr.str(); } @@ -60,7 +60,7 @@ namespace template static int test_io_quat(OS& os) { - os << '\n' << typeid(OS).name() << '\n'; + os << "\n" << typeid(OS).name() << "\n"; glm::qua const q(1, 0, 0, 0); @@ -68,14 +68,14 @@ static int test_io_quat(OS& os) glm::io::basic_format_saver const iofs(os); os << glm::io::precision(2) << glm::io::width(1 + 2 + 1 + 2) - << type_name(os, q) << ": " << q << '\n'; + << type_name(os, q) << ": " << q << "\n"; } { glm::io::basic_format_saver const iofs(os); os << glm::io::unformatted - << type_name(os, q) << ": " << q << '\n'; + << type_name(os, q) << ": " << q << "\n"; } return 0; @@ -84,22 +84,22 @@ static int test_io_quat(OS& os) template static int test_io_vec(OS& os) { - os << '\n' << typeid(OS).name() << '\n'; + os << "\n" << typeid(OS).name() << "\n"; glm::vec<2, T,P> const v2(0, 1); glm::vec<3, T,P> const v3(2, 3, 4); glm::vec<4, T,P> const v4(5, 6, 7, 8); - os << type_name(os, v2) << ": " << v2 << '\n' - << type_name(os, v3) << ": " << v3 << '\n' - << type_name(os, v4) << ": " << v4 << '\n'; + os << type_name(os, v2) << ": " << v2 << "\n" + << type_name(os, v3) << ": " << v3 << "\n" + << type_name(os, v4) << ": " << v4 << "\n"; glm::io::basic_format_saver const iofs(os); os << glm::io::precision(2) << glm::io::width(1 + 2 + 1 + 2) - << type_name(os, v2) << ": " << v2 << '\n' - << type_name(os, v3) << ": " << v3 << '\n' - << type_name(os, v4) << ": " << v4 << '\n'; + << type_name(os, v2) << ": " << v2 << "\n" + << type_name(os, v3) << ": " << v3 << "\n" + << type_name(os, v4) << ": " << v4 << "\n"; return 0; } @@ -107,7 +107,7 @@ static int test_io_vec(OS& os) template static int test_io_mat(OS& os, glm::io::order_type otype) { - os << '\n' << typeid(OS).name() << '\n'; + os << "\n" << typeid(OS).name() << "\n"; glm::vec<2, T,P> const v2_1( 0, 1); glm::vec<2, T,P> const v2_2( 2, 3); @@ -126,27 +126,27 @@ static int test_io_mat(OS& os, glm::io::order_type otype) os << glm::io::precision(2) << glm::io::width(1 + 2 + 1 + 2) << glm::io::order(otype) - << "mat2x2<" << typeid(T).name() << ',' << P << ">: " << glm::mat<2, 2, T,P>(v2_1, v2_2) << '\n' - << "mat2x3<" << typeid(T).name() << ',' << P << ">: " << glm::mat<2, 3, T,P>(v3_1, v3_2) << '\n' - << "mat2x4<" << typeid(T).name() << ',' << P << ">: " << glm::mat<2, 4, T,P>(v4_1, v4_2) << '\n' - << "mat3x2<" << typeid(T).name() << ',' << P << ">: " << glm::mat<3, 2, T,P>(v2_1, v2_2, v2_3) << '\n' - << "mat3x3<" << typeid(T).name() << ',' << P << ">: " << glm::mat<3, 3, T,P>(v3_1, v3_2, v3_3) << '\n' - << "mat3x4<" << typeid(T).name() << ',' << P << ">: " << glm::mat<3, 4, T,P>(v4_1, v4_2, v4_3) << '\n' - << "mat4x2<" << typeid(T).name() << ',' << P << ">: " << glm::mat<4, 2, T,P>(v2_1, v2_2, v2_3, v2_4) << '\n' - << "mat4x3<" << typeid(T).name() << ',' << P << ">: " << glm::mat<4, 3, T,P>(v3_1, v3_2, v3_3, v3_4) << '\n' - << "mat4x4<" << typeid(T).name() << ',' << P << ">: " << glm::mat<4, 4, T,P>(v4_1, v4_2, v4_3, v4_4) << '\n'; + << "mat2x2<" << typeid(T).name() << "," << P << ">: " << glm::mat<2, 2, T,P>(v2_1, v2_2) << "\n" + << "mat2x3<" << typeid(T).name() << "," << P << ">: " << glm::mat<2, 3, T,P>(v3_1, v3_2) << "\n" + << "mat2x4<" << typeid(T).name() << "," << P << ">: " << glm::mat<2, 4, T,P>(v4_1, v4_2) << "\n" + << "mat3x2<" << typeid(T).name() << "," << P << ">: " << glm::mat<3, 2, T,P>(v2_1, v2_2, v2_3) << "\n" + << "mat3x3<" << typeid(T).name() << "," << P << ">: " << glm::mat<3, 3, T,P>(v3_1, v3_2, v3_3) << "\n" + << "mat3x4<" << typeid(T).name() << "," << P << ">: " << glm::mat<3, 4, T,P>(v4_1, v4_2, v4_3) << "\n" + << "mat4x2<" << typeid(T).name() << "," << P << ">: " << glm::mat<4, 2, T,P>(v2_1, v2_2, v2_3, v2_4) << "\n" + << "mat4x3<" << typeid(T).name() << "," << P << ">: " << glm::mat<4, 3, T,P>(v3_1, v3_2, v3_3, v3_4) << "\n" + << "mat4x4<" << typeid(T).name() << "," << P << ">: " << glm::mat<4, 4, T,P>(v4_1, v4_2, v4_3, v4_4) << "\n"; os << glm::io::unformatted << glm::io::order(otype) - << "mat2x2<" << typeid(T).name() << ',' << P << ">: " << glm::mat<2, 2, T,P>(v2_1, v2_2) << '\n' - << "mat2x3<" << typeid(T).name() << ',' << P << ">: " << glm::mat<2, 3, T,P>(v3_1, v3_2) << '\n' - << "mat2x4<" << typeid(T).name() << ',' << P << ">: " << glm::mat<2, 4, T,P>(v4_1, v4_2) << '\n' - << "mat3x2<" << typeid(T).name() << ',' << P << ">: " << glm::mat<3, 2, T,P>(v2_1, v2_2, v2_3) << '\n' - << "mat3x3<" << typeid(T).name() << ',' << P << ">: " << glm::mat<3, 3, T,P>(v3_1, v3_2, v3_3) << '\n' - << "mat3x4<" << typeid(T).name() << ',' << P << ">: " << glm::mat<3, 4, T,P>(v4_1, v4_2, v4_3) << '\n' - << "mat4x2<" << typeid(T).name() << ',' << P << ">: " << glm::mat<4, 2, T,P>(v2_1, v2_2, v2_3, v2_4) << '\n' - << "mat4x3<" << typeid(T).name() << ',' << P << ">: " << glm::mat<4, 3, T,P>(v3_1, v3_2, v3_3, v3_4) << '\n' - << "mat4x4<" << typeid(T).name() << ',' << P << ">: " << glm::mat<4, 4, T,P>(v4_1, v4_2, v4_3, v4_4) << '\n'; + << "mat2x2<" << typeid(T).name() << "," << P << ">: " << glm::mat<2, 2, T,P>(v2_1, v2_2) << "\n" + << "mat2x3<" << typeid(T).name() << "," << P << ">: " << glm::mat<2, 3, T,P>(v3_1, v3_2) << "\n" + << "mat2x4<" << typeid(T).name() << "," << P << ">: " << glm::mat<2, 4, T,P>(v4_1, v4_2) << "\n" + << "mat3x2<" << typeid(T).name() << "," << P << ">: " << glm::mat<3, 2, T,P>(v2_1, v2_2, v2_3) << "\n" + << "mat3x3<" << typeid(T).name() << "," << P << ">: " << glm::mat<3, 3, T,P>(v3_1, v3_2, v3_3) << "\n" + << "mat3x4<" << typeid(T).name() << "," << P << ">: " << glm::mat<3, 4, T,P>(v4_1, v4_2, v4_3) << "\n" + << "mat4x2<" << typeid(T).name() << "," << P << ">: " << glm::mat<4, 2, T,P>(v2_1, v2_2, v2_3, v2_4) << "\n" + << "mat4x3<" << typeid(T).name() << "," << P << ">: " << glm::mat<4, 3, T,P>(v3_1, v3_2, v3_3, v3_4) << "\n" + << "mat4x4<" << typeid(T).name() << "," << P << ">: " << glm::mat<4, 4, T,P>(v4_1, v4_2, v4_3, v4_4) << "\n"; return 0; }