Backport of two upstream build fixes needed for Firefox's hazard build (GCC + libstdc++ 10 sysroot + C++20 + -fno-rtti): - dynamic_cast -> static_cast in affixmgr.cxx Upstream PR: https://github.com/hunspell/hunspell/pull/1124 (merged) - Gate std::bit_cast on __cpp_lib_bit_cast in csutil.cxx / hashmgr.cxx Upstream PR: https://github.com/hunspell/hunspell/pull/1125 (merged) Both will land naturally on the next vendor bump; this patch can be dropped then. --- a/src/affixmgr.cxx +++ b/src/affixmgr.cxx @@ -4697,9 +4697,9 @@ bool AffixMgr::parse_affix(const std::string& line, auto start = affentries.begin(), end = affentries.end(); for (auto affentry = start; affentry != end; ++affentry) { if (at == 'P') { - build_pfxtree(dynamic_cast(*affentry)); + build_pfxtree(static_cast(*affentry)); } else { - build_sfxtree(dynamic_cast(*affentry)); + build_sfxtree(static_cast(*affentry)); } } --- a/src/csutil.cxx +++ b/src/csutil.cxx @@ -559,7 +559,7 @@ w_char upper_utf(w_char u, int langnum) { //but g++ remains in five instructions //maybe use inline asm for g++? -#if __cplusplus >= 202002L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) +#if (__cplusplus >= 202002L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)) && defined __cpp_lib_bit_cast && __cpp_lib_bit_cast >= 201806L return std::bit_cast(unicodetoupper((unsigned short)u, langnum)); #else const auto us = unicodetoupper((unsigned short)u, langnum); @@ -583,7 +583,7 @@ w_char lower_utf(w_char u, int langnum) { //but g++ remains in five instructions //maybe use inline asm for g++? -#if __cplusplus >= 202002L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) +#if (__cplusplus >= 202002L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)) && defined __cpp_lib_bit_cast && __cpp_lib_bit_cast >= 201806L return std::bit_cast(unicodetolower((unsigned short)u, langnum)); #else const auto us = unicodetolower((unsigned short)u, langnum); --- a/src/hashmgr.cxx +++ b/src/hashmgr.cxx @@ -983,7 +983,7 @@ std::string HashMgr::encode_flag(unsigned short f) const { #if defined(_WIN32) || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__)) || defined(__LITTLE_ENDIAN__) -#if __cplusplus >= 202002L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) +#if (__cplusplus >= 202002L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)) && defined __cpp_lib_bit_cast && __cpp_lib_bit_cast >= 201806L auto wc = std::bit_cast(f); #else w_char wc;