Browse Source

Merge topic 'relax_cxx_relaxed_constexpr_requirements'

d156f8f5a2 CompileFeatures: Record when MSVC gained full CXX14 support
62dbe53a8a CompileFeatures: Record when Intel gained full CXX14 support
1ebb0d79fe CompileFeatures: Relax cxx_relaxed_constexpr compiler requirements

Acked-by: Kitware Robot <[email protected]>
Merge-request: !3292
Brad King 6 years ago
parent
commit
730d8a135e

+ 1 - 1
Modules/Compiler/Intel-CXX-FeatureTests.cmake

@@ -24,7 +24,7 @@ set(DETECT_CXX14 "((__cplusplus >= 201300L) || ((__cplusplus == 201103L) && !def
 unset(DETECT_BUGGY_ICC15)
 
 set(Intel17_CXX14 "__INTEL_COMPILER >= 1700 && ${DETECT_CXX14}")
-set(_cmake_feature_test_cxx_relaxed_constexpr "__cpp_constexpr >= 201304 || (${Intel17_CXX14} && !(__INTEL_COMPILER == 1800 && __INTEL_COMPILER_UPDATE < 5) && !defined(_MSC_VER))")
+set(_cmake_feature_test_cxx_relaxed_constexpr "__cpp_constexpr >= 201304 || (${Intel17_CXX14} && !defined(_MSC_VER))")
 
 set(Intel16_CXX14 "__INTEL_COMPILER >= 1600 && ${DETECT_CXX14}")
 set(_cmake_feature_test_cxx_aggregate_default_initializers "${Intel16_CXX14}")

+ 1 - 7
Modules/Compiler/Intel-CXX.cmake

@@ -40,13 +40,7 @@ else()
     set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
   endif()
 
-  # While full C++14 support was first introduced in Intel 17,
-  # Intel 18.0.0-4 don't have full support as they broke
-  # support for cxx_relaxed_constexpr.
-  if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 18.0.4)
-    set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
-  elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 17.0.0
-        AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 18.0.0)
+  if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 17.0)
     set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
   endif()
 

+ 2 - 4
Modules/Compiler/MSVC-CXX-FeatureTests.cmake

@@ -9,10 +9,8 @@ set(_cmake_oldestSupported "_MSC_VER >= 1600")
 # https://docs.microsoft.com/en-us/cpp/cpp-conformance-improvements-2017#update_153
 set(_cmake_feature_test_cxx_decltype_incomplete_return_types "_MSC_VER >= 1911")
 
-set(MSVC_2017 "_MSC_VER >= 1910")
-# VS 2017 introduces support for "N3652 Extended constexpr"
-# but as of v15.6 there are still bugs in the implementation
-#set(_cmake_feature_test_cxx_relaxed_constexpr "${MSVC_2017}")
+# VS 2017 v15.3 fixes support for "N3652 Extended constexpr"
+set(_cmake_feature_test_cxx_relaxed_constexpr "_MSC_VER >= 1911")
 
 # VS 2017 Preview introduces support for aggregate initializers.
 set(_cmake_feature_test_cxx_aggregate_default_initializers "_MSC_FULL_VER >= 190024406")

+ 1 - 0
Modules/Compiler/MSVC-CXX.cmake

@@ -18,6 +18,7 @@ if ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.0.24215.1 AND
   set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std:c++14")
   if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.11.25505)
     set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
     set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std:c++17")
     set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std:c++17")
   else()

+ 2 - 1
Tests/CompileFeatures/cxx_relaxed_constexpr.cpp

@@ -22,6 +22,7 @@ constexpr int g(const int (&is)[4])
 
 int someFunc()
 {
-  constexpr int k3 = g({ 4, 5, 6, 7 });
+  constexpr int values[4] = { 4, 5, 6, 7 };
+  constexpr int k3 = g(values);
   return k3 - 42;
 }