From 8780fbb2ebff82f6e9b2dbae9a523d094d327b32 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Thu, 8 Oct 2020 22:29:04 +0200 Subject: [PATCH] Build Qt (and client apps using it) with /permissive- *Not* using /permissive- exposes Qt and client apps to interesting bugs and/or build failures, (e.g. QTBUG-87225, or 19b5520abfb5f66d4b83c7a18cc72d68673d098a). We demand strict conformance by any other compiler, it's time to demand it from MSVC too. The Windows headers themselves are clean starting from the Windows Fall Creators SDK (10.0.16299.0), and moreover Qt 6 will drop WinRT; therefore, the comment in the mkspecs does not apply any more. Since /permissive- implies /Zc:referenceBinding, drop that option. The other implied options are set on MSVC < 2017, but I leave them in to avoid tinkering with the fragile lists of C/C++ flags. Rename the CMake internal helper function to better describe what it does. Fixes: QTBUG-85633 Fixes: QTBUG-85637 Fixes: QTBUG-85635 Fixes: QTBUG-88244 Change-Id: Ie03fddb61aa066fdc14b7231c22e7108b4a02fbb Reviewed-by: Friedemann Kleint Reviewed-by: Kai Koehne Reviewed-by: Volker Hilsheimer --- cmake/QtFlagHandlingHelpers.cmake | 4 ++-- cmake/QtPublicTargetsHelpers.cmake | 2 +- mkspecs/common/msvc-version.conf | 7 +------ qmake/CMakeLists.txt | 2 +- src/tools/bootstrap/CMakeLists.txt | 2 +- 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/cmake/QtFlagHandlingHelpers.cmake b/cmake/QtFlagHandlingHelpers.cmake index b9835a36394..250df5de2db 100644 --- a/cmake/QtFlagHandlingHelpers.cmake +++ b/cmake/QtFlagHandlingHelpers.cmake @@ -228,11 +228,11 @@ function(qt_set_language_standards_interface_compile_features target) target_compile_features("${target}" INTERFACE ${cpp_feature}) endfunction() -function(qt_enable_msvc_cplusplus_define target visibility) +function(qt_set_msvc_cplusplus_options target visibility) # For MSVC we need to explicitly pass -Zc:__cplusplus to get correct __cplusplus. # Check qt_config_compile_test for more info. if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND MSVC_VERSION GREATER_EQUAL 1913) - target_compile_options("${target}" ${visibility} "-Zc:__cplusplus") + target_compile_options("${target}" ${visibility} "-Zc:__cplusplus" "-permissive-") endif() endfunction() diff --git a/cmake/QtPublicTargetsHelpers.cmake b/cmake/QtPublicTargetsHelpers.cmake index 8d916535ac2..2e5eb564f4d 100644 --- a/cmake/QtPublicTargetsHelpers.cmake +++ b/cmake/QtPublicTargetsHelpers.cmake @@ -20,7 +20,7 @@ function(qt_internal_setup_public_platform_target) target_link_libraries(Platform INTERFACE log) endif() - qt_enable_msvc_cplusplus_define(Platform INTERFACE) + qt_set_msvc_cplusplus_options(Platform INTERFACE) # Propagate minimum C++ 17 via Platform to Qt consumers (apps), after the global features # are computed. diff --git a/mkspecs/common/msvc-version.conf b/mkspecs/common/msvc-version.conf index eee5cc0dd53..26ff635e65b 100644 --- a/mkspecs/common/msvc-version.conf +++ b/mkspecs/common/msvc-version.conf @@ -78,7 +78,7 @@ greaterThan(QMAKE_MSC_VER, 1909) { # Visual Studio 2017 (15.0) / Visual C++ 19.10 and up MSVC_VER = 15.0 COMPAT_MKSPEC = win32-msvc2017 - QMAKE_CXXFLAGS += -Zc:referenceBinding + QMAKE_CXXFLAGS += -permissive- # Only Visual Studio 2017 version 15.3 / Visual C++ 19.11 & up have support # for AVX-512. We enable the switches anyway and let configure check if they @@ -93,11 +93,6 @@ greaterThan(QMAKE_MSC_VER, 1909) { QMAKE_CFLAGS_AVX512IFMA = -arch:AVX512 QMAKE_CFLAGS_AVX512VBMI = -arch:AVX512 - # For now permissive fails as soon as UWP API comes into play. In qtbase this - # API is used in direct2d, but also in multimedia, positioning and sensors. - # We can try again with a later version of Visual Studio. - # QMAKE_CXXFLAGS_STRICTCXX = -permissive- - # MSVC partially supports the following, but '__cplusplus' definition is set # as for C++98 until MSVC fully conforms with C++14, see # https://developercommunity.visualstudio.com/content/problem/139261/msvc-incorrectly-defines-cplusplus.html diff --git a/qmake/CMakeLists.txt b/qmake/CMakeLists.txt index 0dc9d5f03c7..133472b78dc 100644 --- a/qmake/CMakeLists.txt +++ b/qmake/CMakeLists.txt @@ -275,7 +275,7 @@ set_target_properties(${target_name} PROPERTIES qt_internal_apply_gc_binaries(${target_name} PRIVATE) # special case -qt_enable_msvc_cplusplus_define(${target_name} PUBLIC) # special case +qt_set_msvc_cplusplus_options(${target_name} PUBLIC) # special case qt_skip_warnings_are_errors(${target_name}) # special case qt_internal_apply_intel_cet(Bootstrap PUBLIC) # special case diff --git a/src/tools/bootstrap/CMakeLists.txt b/src/tools/bootstrap/CMakeLists.txt index 7669207fddc..b61b7cbd992 100644 --- a/src/tools/bootstrap/CMakeLists.txt +++ b/src/tools/bootstrap/CMakeLists.txt @@ -265,6 +265,6 @@ target_link_libraries(Bootstrap PRIVATE PlatformCommonInternal) qt_internal_apply_gc_binaries(Bootstrap PUBLIC) set_target_properties(Bootstrap PROPERTIES AUTOMOC OFF AUTOUIC OFF AUTORCC OFF) qt_internal_add_target_aliases(Bootstrap) -qt_enable_msvc_cplusplus_define(Bootstrap PUBLIC) +qt_set_msvc_cplusplus_options(Bootstrap PUBLIC) qt_internal_apply_intel_cet(Bootstrap PUBLIC) # special case end