diff --git a/src/Magnum/ShaderTools/AbstractConverter.h b/src/Magnum/ShaderTools/AbstractConverter.h index 414d14de1..3c2360d74 100644 --- a/src/Magnum/ShaderTools/AbstractConverter.h +++ b/src/Magnum/ShaderTools/AbstractConverter.h @@ -1218,7 +1218,19 @@ template void AbstractConverter::setInputFileCallback(C /* Don't try to wrap a null function pointer. Need to cast first because MSVC (even 2017) can't apply ! to a lambda. Ugh. */ const auto callbackPtr = static_cast>(*)(const std::string&, InputFileCallbackPolicy, T&)>(callback); - if(!callbackPtr) return setInputFileCallback(nullptr); + /* With -std=c++17 or higher enabled, GCC says that "warning: the address + of will never be NULL". Well of course it won't, but this + function can get also a null plain function pointer, it's a goddamn + template after all. Shut up. */ + #if defined(CORRADE_TARGET_GCC) && !defined(CORRADE_TARGET_CLANG) && defined(CORRADE_TARGET_CXX17) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Waddress" + #endif + if(!callbackPtr) + return setInputFileCallback(nullptr); + #if defined(CORRADE_TARGET_GCC) && !defined(CORRADE_TARGET_CLANG) && defined(CORRADE_TARGET_CXX17) + #pragma GCC diagnostic pop + #endif _inputFileCallbackTemplate = { reinterpret_cast(callbackPtr), static_cast(&userData) }; setInputFileCallback([](const std::string& filename, const InputFileCallbackPolicy flags, void* const userData) { diff --git a/src/Magnum/Text/AbstractFont.h b/src/Magnum/Text/AbstractFont.h index 62a564e8b..30493f970 100644 --- a/src/Magnum/Text/AbstractFont.h +++ b/src/Magnum/Text/AbstractFont.h @@ -915,7 +915,19 @@ template void AbstractFont::setFileCallback(Callback ca /* Don't try to wrap a null function pointer. Need to cast first because MSVC (even 2017) can't apply ! to a lambda. Ugh. */ const auto callbackPtr = static_cast>(*)(const std::string&, InputFileCallbackPolicy, T&)>(callback); - if(!callbackPtr) return setFileCallback(nullptr); + /* With -std=c++17 or higher enabled, GCC says that "warning: the address + of will never be NULL". Well of course it won't, but this + function can get also a null plain function pointer, it's a goddamn + template after all. Shut up. */ + #if defined(CORRADE_TARGET_GCC) && !defined(CORRADE_TARGET_CLANG) && defined(CORRADE_TARGET_CXX17) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Waddress" + #endif + if(!callbackPtr) + return setFileCallback(nullptr); + #if defined(CORRADE_TARGET_GCC) && !defined(CORRADE_TARGET_CLANG) && defined(CORRADE_TARGET_CXX17) + #pragma GCC diagnostic pop + #endif _fileCallbackTemplate = { reinterpret_cast(callbackPtr), static_cast(&userData) }; setFileCallback([](const std::string& filename, const InputFileCallbackPolicy flags, void* const userData) { diff --git a/src/Magnum/Trade/AbstractImporter.h b/src/Magnum/Trade/AbstractImporter.h index 4cc516713..8de6ed92d 100644 --- a/src/Magnum/Trade/AbstractImporter.h +++ b/src/Magnum/Trade/AbstractImporter.h @@ -2654,7 +2654,19 @@ template void AbstractImporter::setFileCallback(Callbac /* Don't try to wrap a null function pointer. Need to cast first because MSVC (even 2017) can't apply ! to a lambda. Ugh. */ const auto callbackPtr = static_cast>(*)(const std::string&, InputFileCallbackPolicy, T&)>(callback); - if(!callbackPtr) return setFileCallback(nullptr); + /* With -std=c++17 or higher enabled, GCC says that "warning: the address + of will never be NULL". Well of course it won't, but this + function can get also a null plain function pointer, it's a goddamn + template after all. Shut up. */ + #if defined(CORRADE_TARGET_GCC) && !defined(CORRADE_TARGET_CLANG) && defined(CORRADE_TARGET_CXX17) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Waddress" + #endif + if(!callbackPtr) + return setFileCallback(nullptr); + #if defined(CORRADE_TARGET_GCC) && !defined(CORRADE_TARGET_CLANG) && defined(CORRADE_TARGET_CXX17) + #pragma GCC diagnostic pop + #endif _fileCallbackTemplate = { reinterpret_cast(callbackPtr), static_cast(&userData) }; setFileCallback([](const std::string& filename, const InputFileCallbackPolicy flags, void* const userData) {