Browse Source

Merge topic 'msvc_c11' into release-3.18

f7347f28c7 MSVC: Record support for C11 and c_restrict

Acked-by: Kitware Robot <[email protected]>
Merge-request: !5115
Brad King 5 years ago
parent
commit
eaf81817c4
3 changed files with 40 additions and 12 deletions
  1. 7 0
      Help/release/3.18.rst
  2. 2 1
      Modules/Compiler/MSVC-C-FeatureTests.cmake
  3. 31 11
      Modules/Compiler/MSVC-C.cmake

+ 7 - 0
Help/release/3.18.rst

@@ -264,6 +264,10 @@ Other
 * :manual:`ccmake(1)` learned to read a :envvar:`CCMAKE_COLORS`
   environment variable to customize colors.
 
+* The :manual:`Compile Features <cmake-compile-features(7)>` functionality
+  is now aware of the availability of C11 features in MSVC 19.27 and above,
+  including support for the ``c_restrict`` feature and the ``-std:c11`` flag.
+
 Deprecated and Removed Features
 ===============================
 
@@ -347,3 +351,6 @@ Changes made since CMake 3.18.0 include the following.
   ``OFF`` because this feature can break existing projects that have
   identically named header files in different include directories.
   This restores compatibility with behavior of CMake 3.15 and below.
+
+* The :manual:`Compile Features <cmake-compile-features(7)>` functionality
+  was updated for MSVC 19.27 as mentioned above.

+ 2 - 1
Modules/Compiler/MSVC-C-FeatureTests.cmake

@@ -2,7 +2,8 @@ set(_cmake_oldestSupported "_MSC_VER >= 1600")
 
 # Not yet supported:
 #set(_cmake_feature_test_c_static_assert "")
-#set(_cmake_feature_test_c_restrict "")
+
+set(_cmake_feature_test_c_restrict "_MSC_VER >= 1927")
 
 set(_cmake_feature_test_c_variadic_macros "${_cmake_oldestSupported}")
 set(_cmake_feature_test_c_function_prototypes "${_cmake_oldestSupported}")

+ 31 - 11
Modules/Compiler/MSVC-C.cmake

@@ -1,15 +1,31 @@
-# MSVC has no specific options to set C language standards, but set them as
-# empty strings anyways so the feature test infrastructure can at least check
-# to see if they are defined.
-set(CMAKE_C90_STANDARD_COMPILE_OPTION "")
-set(CMAKE_C90_EXTENSION_COMPILE_OPTION "")
-set(CMAKE_C99_STANDARD_COMPILE_OPTION "")
-set(CMAKE_C99_EXTENSION_COMPILE_OPTION "")
-set(CMAKE_C11_STANDARD_COMPILE_OPTION "")
-set(CMAKE_C11_EXTENSION_COMPILE_OPTION "")
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
 
-# There is no meaningful default for this
-set(CMAKE_C_STANDARD_DEFAULT "")
+include(Compiler/CMakeCommonCompilerMacros)
+
+if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27)
+  set(CMAKE_C90_STANDARD_COMPILE_OPTION "")
+  set(CMAKE_C90_EXTENSION_COMPILE_OPTION "")
+  set(CMAKE_C99_STANDARD_COMPILE_OPTION "")
+  set(CMAKE_C99_EXTENSION_COMPILE_OPTION "")
+  set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std:c11")
+  set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std:c11")
+
+  __compiler_check_default_language_standard(C 19.27 99)
+else()
+  # MSVC has no specific options to set C language standards, but set them as
+  # empty strings anyways so the feature test infrastructure can at least check
+  # to see if they are defined.
+  set(CMAKE_C90_STANDARD_COMPILE_OPTION "")
+  set(CMAKE_C90_EXTENSION_COMPILE_OPTION "")
+  set(CMAKE_C99_STANDARD_COMPILE_OPTION "")
+  set(CMAKE_C99_EXTENSION_COMPILE_OPTION "")
+  set(CMAKE_C11_STANDARD_COMPILE_OPTION "")
+  set(CMAKE_C11_EXTENSION_COMPILE_OPTION "")
+
+  # There is no meaningful default for this
+  set(CMAKE_C_STANDARD_DEFAULT "")
+endif()
 
 set(CMAKE_C_CLANG_TIDY_DRIVER_MODE "cl")
 
@@ -31,6 +47,10 @@ macro(cmake_record_c_compile_features)
     list(APPEND CMAKE_C_COMPILE_FEATURES c_variadic_macros)
     list(APPEND CMAKE_C99_COMPILE_FEATURES c_variadic_macros)
   endif()
+  if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27)
+    list(APPEND CMAKE_C_COMPILE_FEATURES c_restrict)
+    list(APPEND CMAKE_C99_COMPILE_FEATURES c_restrict)
+  endif()
   set(_result 0) # expected by cmake_determine_compile_features
 endmacro()