common,yuzu-qt: Avoid explicit instantiation on old clang

Clang versions < 15 have compile issues with explicit instantiation.
Disable it for these versions.
This commit is contained in:
lat9nq 2023-06-18 19:57:14 -04:00
parent c97cbd089b
commit 3f0cc544cf
6 changed files with 22 additions and 3 deletions

View file

@ -197,10 +197,15 @@ if (MSVC)
/we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
/we4800 # Implicit conversion from 'type' to bool. Possible information loss /we4800 # Implicit conversion from 'type' to bool. Possible information loss
) )
else() endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
target_compile_options(common PRIVATE target_compile_options(common PRIVATE
$<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation> -fsized-deallocation
$<$<CXX_COMPILER_ID:Clang>:-Werror=unreachable-code-aggressive> -Werror=unreachable-code-aggressive
)
target_compile_definitions(common PRIVATE
$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,15>:_CANNOT_EXPLICITLY_INSTANTIATE>
) )
endif() endif()

View file

@ -25,6 +25,7 @@
namespace Settings { namespace Settings {
#ifndef _CANNOT_EXPLICITLY_INSTANTIATE
#define SETTING(TYPE, RANGED) template class Setting<TYPE, RANGED> #define SETTING(TYPE, RANGED) template class Setting<TYPE, RANGED>
#define SWITCHABLE(TYPE, RANGED) template class SwitchableSetting<TYPE, RANGED> #define SWITCHABLE(TYPE, RANGED) template class SwitchableSetting<TYPE, RANGED>
@ -61,6 +62,7 @@ SWITCHABLE(u8, true);
#undef SETTING #undef SETTING
#undef SWITCHABLE #undef SWITCHABLE
#endif
Values values; Values values;

View file

@ -45,6 +45,7 @@ struct ResolutionScalingInfo {
} }
}; };
#ifndef _CANNOT_EXPLICITLY_INSTANTIATE
// Instantiate the classes elsewhere (settings.cpp) to reduce compiler/linker work // Instantiate the classes elsewhere (settings.cpp) to reduce compiler/linker work
#define SETTING(TYPE, RANGED) extern template class Setting<TYPE, RANGED> #define SETTING(TYPE, RANGED) extern template class Setting<TYPE, RANGED>
#define SWITCHABLE(TYPE, RANGED) extern template class SwitchableSetting<TYPE, RANGED> #define SWITCHABLE(TYPE, RANGED) extern template class SwitchableSetting<TYPE, RANGED>
@ -84,6 +85,7 @@ SWITCHABLE(u8, true);
#undef SETTING #undef SETTING
#undef SWITCHABLE #undef SWITCHABLE
#endif
/** /**
* The InputSetting class allows for getting a reference to either the global or custom members. * The InputSetting class allows for getting a reference to either the global or custom members.

View file

@ -235,6 +235,12 @@ if (WIN32 AND YUZU_CRASH_DUMPS)
target_compile_definitions(yuzu PRIVATE -DYUZU_DBGHELP) target_compile_definitions(yuzu PRIVATE -DYUZU_DBGHELP)
endif() endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
target_compile_definitions(yuzu PRIVATE
$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,15>:_CANNOT_EXPLICITLY_INSTANTIATE>
)
endif()
file(GLOB COMPAT_LIST file(GLOB COMPAT_LIST
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json) ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json)

View file

@ -3,6 +3,7 @@
#include "yuzu/uisettings.h" #include "yuzu/uisettings.h"
#ifndef _CANNOT_EXPLICITLY_INSTANTIATE
namespace Settings { namespace Settings {
template class Setting<bool>; template class Setting<bool>;
template class Setting<std::string>; template class Setting<std::string>;
@ -12,6 +13,7 @@ template class Setting<u8, true>;
template class Setting<u8>; template class Setting<u8>;
template class Setting<unsigned long long>; template class Setting<unsigned long long>;
} // namespace Settings } // namespace Settings
#endif
namespace UISettings { namespace UISettings {

View file

@ -17,6 +17,7 @@
using Settings::Category; using Settings::Category;
using Settings::Setting; using Settings::Setting;
#ifndef _CANNOT_EXPLICITLY_INSTANTIATE
namespace Settings { namespace Settings {
extern template class Setting<bool>; extern template class Setting<bool>;
extern template class Setting<std::string>; extern template class Setting<std::string>;
@ -26,6 +27,7 @@ extern template class Setting<u8, true>;
extern template class Setting<u8>; extern template class Setting<u8>;
extern template class Setting<unsigned long long>; extern template class Setting<unsigned long long>;
} // namespace Settings } // namespace Settings
#endif
namespace UISettings { namespace UISettings {