C23 support

This commit is contained in:
Raul Tambre 2021-02-06 18:59:23 +02:00
parent 93b7d3d292
commit dcd599757f
11 changed files with 26 additions and 5 deletions

View File

@ -27,6 +27,9 @@ The features known to this version of CMake are:
``c_std_17`` ``c_std_17``
Compiler mode is at least C 17. Compiler mode is at least C 17.
``c_std_23``
Compiler mode is at least C 23.
``c_function_prototypes`` ``c_function_prototypes``
Function prototypes, as defined in ``ISO/IEC 9899:1990``. Function prototypes, as defined in ``ISO/IEC 9899:1990``.

View File

@ -11,7 +11,7 @@ flag such as ``-std=gnu11`` to the compile line. For compilers that
have no notion of a C standard level, such as Microsoft Visual C++ before have no notion of a C standard level, such as Microsoft Visual C++ before
VS 16.7, this property has no effect. VS 16.7, this property has no effect.
Supported values are ``90``, ``99``, ``11``, ``17``. Supported values are ``90``, ``99``, ``11``, ``17``, ``23``.
If the value requested does not result in a compile flag being added for If the value requested does not result in a compile flag being added for
the compiler in use, a previous standard flag will be added instead. This the compiler in use, a previous standard flag will be added instead. This

View File

@ -3,4 +3,4 @@ c-std
* :prop_tgt:`C_STANDARD` and the * :prop_tgt:`C_STANDARD` and the
:manual:`Compile Features <cmake-compile-features(7)>` functionality gained :manual:`Compile Features <cmake-compile-features(7)>` functionality gained
support for C17. support for C17 and C23.

View File

@ -10,6 +10,7 @@ set(CMAKE_C90_COMPILE_FEATURES "@CMAKE_C90_COMPILE_FEATURES@")
set(CMAKE_C99_COMPILE_FEATURES "@CMAKE_C99_COMPILE_FEATURES@") set(CMAKE_C99_COMPILE_FEATURES "@CMAKE_C99_COMPILE_FEATURES@")
set(CMAKE_C11_COMPILE_FEATURES "@CMAKE_C11_COMPILE_FEATURES@") set(CMAKE_C11_COMPILE_FEATURES "@CMAKE_C11_COMPILE_FEATURES@")
set(CMAKE_C17_COMPILE_FEATURES "@CMAKE_C17_COMPILE_FEATURES@") set(CMAKE_C17_COMPILE_FEATURES "@CMAKE_C17_COMPILE_FEATURES@")
set(CMAKE_C23_COMPILE_FEATURES "@CMAKE_C23_COMPILE_FEATURES@")
set(CMAKE_C_PLATFORM_ID "@CMAKE_C_PLATFORM_ID@") set(CMAKE_C_PLATFORM_ID "@CMAKE_C_PLATFORM_ID@")
set(CMAKE_C_SIMULATE_ID "@CMAKE_C_SIMULATE_ID@") set(CMAKE_C_SIMULATE_ID "@CMAKE_C_SIMULATE_ID@")

View File

@ -39,6 +39,8 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
# else # else
# define C_DIALECT # define C_DIALECT
# endif # endif
#elif __STDC_VERSION__ > 201710L
# define C_DIALECT "23"
#elif __STDC_VERSION__ >= 201710L #elif __STDC_VERSION__ >= 201710L
# define C_DIALECT "17" # define C_DIALECT "17"
#elif __STDC_VERSION__ >= 201000L #elif __STDC_VERSION__ >= 201000L

View File

@ -11,6 +11,7 @@ function(cmake_determine_compile_features lang)
set(CMAKE_C99_COMPILE_FEATURES) set(CMAKE_C99_COMPILE_FEATURES)
set(CMAKE_C11_COMPILE_FEATURES) set(CMAKE_C11_COMPILE_FEATURES)
set(CMAKE_C17_COMPILE_FEATURES) set(CMAKE_C17_COMPILE_FEATURES)
set(CMAKE_C23_COMPILE_FEATURES)
include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake") include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake")
@ -21,6 +22,9 @@ function(cmake_determine_compile_features lang)
return() return()
endif() endif()
if (CMAKE_C17_COMPILE_FEATURES AND CMAKE_C23_COMPILE_FEATURES)
list(REMOVE_ITEM CMAKE_C23_COMPILE_FEATURES ${CMAKE_C17_COMPILE_FEATURES})
endif()
if (CMAKE_C11_COMPILE_FEATURES AND CMAKE_C17_COMPILE_FEATURES) if (CMAKE_C11_COMPILE_FEATURES AND CMAKE_C17_COMPILE_FEATURES)
list(REMOVE_ITEM CMAKE_C17_COMPILE_FEATURES ${CMAKE_C11_COMPILE_FEATURES}) list(REMOVE_ITEM CMAKE_C17_COMPILE_FEATURES ${CMAKE_C11_COMPILE_FEATURES})
endif() endif()
@ -37,6 +41,7 @@ function(cmake_determine_compile_features lang)
${CMAKE_C99_COMPILE_FEATURES} ${CMAKE_C99_COMPILE_FEATURES}
${CMAKE_C11_COMPILE_FEATURES} ${CMAKE_C11_COMPILE_FEATURES}
${CMAKE_C17_COMPILE_FEATURES} ${CMAKE_C17_COMPILE_FEATURES}
${CMAKE_C23_COMPILE_FEATURES}
) )
endif() endif()
@ -45,6 +50,7 @@ function(cmake_determine_compile_features lang)
set(CMAKE_C99_COMPILE_FEATURES ${CMAKE_C99_COMPILE_FEATURES} PARENT_SCOPE) set(CMAKE_C99_COMPILE_FEATURES ${CMAKE_C99_COMPILE_FEATURES} PARENT_SCOPE)
set(CMAKE_C11_COMPILE_FEATURES ${CMAKE_C11_COMPILE_FEATURES} PARENT_SCOPE) set(CMAKE_C11_COMPILE_FEATURES ${CMAKE_C11_COMPILE_FEATURES} PARENT_SCOPE)
set(CMAKE_C17_COMPILE_FEATURES ${CMAKE_C17_COMPILE_FEATURES} PARENT_SCOPE) set(CMAKE_C17_COMPILE_FEATURES ${CMAKE_C17_COMPILE_FEATURES} PARENT_SCOPE)
set(CMAKE_C23_COMPILE_FEATURES ${CMAKE_C23_COMPILE_FEATURES} PARENT_SCOPE)
message(CHECK_PASS "done") message(CHECK_PASS "done")

View File

@ -64,6 +64,9 @@ endmacro()
# Define to allow compile features to be automatically determined # Define to allow compile features to be automatically determined
macro(cmake_record_c_compile_features) macro(cmake_record_c_compile_features)
set(_result 0) set(_result 0)
if(_result EQUAL 0 AND DEFINED CMAKE_C23_STANDARD_COMPILE_OPTION)
_has_compiler_features_c(23)
endif()
if(_result EQUAL 0 AND DEFINED CMAKE_C17_STANDARD_COMPILE_OPTION) if(_result EQUAL 0 AND DEFINED CMAKE_C17_STANDARD_COMPILE_OPTION)
_has_compiler_features_c(17) _has_compiler_features_c(17)
endif() endif()

View File

@ -309,8 +309,8 @@ std::unordered_map<std::string, StanardLevelComputer> StandardComputerMapping =
{ {
{ "C", { "C",
StanardLevelComputer{ StanardLevelComputer{
"C", std::vector<int>{ 90, 99, 11, 17 }, "C", std::vector<int>{ 90, 99, 11, 17, 23 },
std::vector<std::string>{ "90", "99", "11", "17" } } }, std::vector<std::string>{ "90", "99", "11", "17", "23" } } },
{ "CXX", { "CXX",
StanardLevelComputer{ StanardLevelComputer{
"CXX", std::vector<int>{ 98, 11, 14, 17, 20, 23 }, "CXX", std::vector<int>{ 98, 11, 14, 17, 20, 23 },

View File

@ -740,6 +740,7 @@ private:
F(c_std_99) \ F(c_std_99) \
F(c_std_11) \ F(c_std_11) \
F(c_std_17) \ F(c_std_17) \
F(c_std_23) \
FOR_EACH_C90_FEATURE(F) \ FOR_EACH_C90_FEATURE(F) \
FOR_EACH_C99_FEATURE(F) \ FOR_EACH_C99_FEATURE(F) \
FOR_EACH_C11_FEATURE(F) FOR_EACH_C11_FEATURE(F)

View File

@ -237,6 +237,7 @@ if (C_expected_features)
if (std_flag_idx EQUAL -1) if (std_flag_idx EQUAL -1)
add_executable(default_dialect_C default_dialect.c) add_executable(default_dialect_C default_dialect.c)
target_compile_definitions(default_dialect_C PRIVATE target_compile_definitions(default_dialect_C PRIVATE
DEFAULT_C23=$<EQUAL:${CMAKE_C_STANDARD_DEFAULT},23>
DEFAULT_C17=$<EQUAL:${CMAKE_C_STANDARD_DEFAULT},17> DEFAULT_C17=$<EQUAL:${CMAKE_C_STANDARD_DEFAULT},17>
DEFAULT_C11=$<EQUAL:${CMAKE_C_STANDARD_DEFAULT},11> DEFAULT_C11=$<EQUAL:${CMAKE_C_STANDARD_DEFAULT},11>
DEFAULT_C99=$<EQUAL:${CMAKE_C_STANDARD_DEFAULT},99> DEFAULT_C99=$<EQUAL:${CMAKE_C_STANDARD_DEFAULT},99>

View File

@ -1,5 +1,9 @@
#if DEFAULT_C17 #if DEFAULT_C23
# if __STDC_VERSION__ <= 201710L
# error Unexpected value for __STDC_VERSION__.
# endif
#elif DEFAULT_C17
# if __STDC_VERSION__ < 201710L # if __STDC_VERSION__ < 201710L
# error Unexpected value for __STDC_VERSION__. # error Unexpected value for __STDC_VERSION__.
# endif # endif