From b9d4db7098898dbaf9dd29f0fbcc166af0e5154e Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 2 Apr 2024 16:50:51 -0400 Subject: CompilerId: Clarify C and C++ standard level detection Use named constants. Regularize comparison patterns. --- Modules/CMakeCCompilerId.c.in | 17 +++++++++++++---- Modules/CMakeCXXCompilerId.cpp.in | 26 +++++++++++++++++--------- Tests/CompileFeatures/default_dialect.c | 16 ++++++++++++---- Tests/CompileFeatures/default_dialect.cpp | 28 ++++++++++++++++++---------- 4 files changed, 60 insertions(+), 27 deletions(-) diff --git a/Modules/CMakeCCompilerId.c.in b/Modules/CMakeCCompilerId.c.in index 82d56cf..759cdf4 100644 --- a/Modules/CMakeCCompilerId.c.in +++ b/Modules/CMakeCCompilerId.c.in @@ -39,19 +39,28 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; @CMAKE_C_COMPILER_ID_PLATFORM_CONTENT@ @CMAKE_C_COMPILER_ID_ERROR_FOR_TEST@ +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + #if !defined(__STDC__) && !defined(__clang__) # if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) # define C_VERSION "90" # else # define C_VERSION # endif -#elif __STDC_VERSION__ > 201710L +#elif C_STD > C_STD_17 # define C_VERSION "23" -#elif __STDC_VERSION__ >= 201710L +#elif C_STD > C_STD_11 # define C_VERSION "17" -#elif __STDC_VERSION__ >= 201000L +#elif C_STD > C_STD_99 # define C_VERSION "11" -#elif __STDC_VERSION__ >= 199901L +#elif C_STD >= C_STD_99 # define C_VERSION "99" #else # define C_VERSION "90" diff --git a/Modules/CMakeCXXCompilerId.cpp.in b/Modules/CMakeCXXCompilerId.cpp.in index 2643326..948209a 100644 --- a/Modules/CMakeCXXCompilerId.cpp.in +++ b/Modules/CMakeCXXCompilerId.cpp.in @@ -33,15 +33,23 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; @CMAKE_CXX_COMPILER_ID_PLATFORM_CONTENT@ @CMAKE_CXX_COMPILER_ID_ERROR_FOR_TEST@ -#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && \ + _MSVC_LANG <= CXX_STD_14 # if defined(__INTEL_CXX11_MODE__) # if defined(__cpp_aggregate_nsdmi) -# define CXX_STD 201402L +# define CXX_STD CXX_STD_14 # else -# define CXX_STD 201103L +# define CXX_STD CXX_STD_11 # endif # else -# define CXX_STD 199711L +# define CXX_STD CXX_STD_98 # endif #elif defined(_MSC_VER) && defined(_MSVC_LANG) # define CXX_STD _MSVC_LANG @@ -50,15 +58,15 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; #endif const char* info_language_standard_default = "INFO" ":" "standard_default[" -#if CXX_STD > 202002L +#if CXX_STD > CXX_STD_20 "23" -#elif CXX_STD > 201703L +#elif CXX_STD > CXX_STD_17 "20" -#elif CXX_STD >= 201703L +#elif CXX_STD > CXX_STD_14 "17" -#elif CXX_STD >= 201402L +#elif CXX_STD > CXX_STD_11 "14" -#elif CXX_STD >= 201103L +#elif CXX_STD >= CXX_STD_11 "11" #else "98" diff --git a/Tests/CompileFeatures/default_dialect.c b/Tests/CompileFeatures/default_dialect.c index cae107b..f1aa78f 100644 --- a/Tests/CompileFeatures/default_dialect.c +++ b/Tests/CompileFeatures/default_dialect.c @@ -1,18 +1,26 @@ +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif #if DEFAULT_C23 -# if __STDC_VERSION__ <= 201710L +# if C_STD <= C_STD_17 # error Unexpected value for __STDC_VERSION__. # endif #elif DEFAULT_C17 -# if __STDC_VERSION__ < 201710L +# if C_STD <= C_STD_11 # error Unexpected value for __STDC_VERSION__. # endif #elif DEFAULT_C11 -# if __STDC_VERSION__ < 201112L +# if C_STD <= C_STD_99 # error Unexpected value for __STDC_VERSION__. # endif #elif DEFAULT_C99 -# if __STDC_VERSION__ != 199901L +# if C_STD != C_STD_99 # error Unexpected value for __STDC_VERSION__. # endif #else diff --git a/Tests/CompileFeatures/default_dialect.cpp b/Tests/CompileFeatures/default_dialect.cpp index bd504ff..88cc12d 100644 --- a/Tests/CompileFeatures/default_dialect.cpp +++ b/Tests/CompileFeatures/default_dialect.cpp @@ -2,15 +2,23 @@ template struct Outputter; -#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && \ + _MSVC_LANG <= CXX_STD_14 # if defined(__INTEL_CXX11_MODE__) # if defined(__cpp_aggregate_nsdmi) -# define CXX_STD 201402L +# define CXX_STD CXX_STD_14 # else -# define CXX_STD 201103L +# define CXX_STD CXX_STD_11 # endif # else -# define CXX_STD 199711L +# define CXX_STD CXX_STD_98 # endif #elif defined(_MSC_VER) && defined(_MSVC_LANG) # define CXX_STD _MSVC_LANG @@ -19,30 +27,30 @@ struct Outputter; #endif #if DEFAULT_CXX23 -# if CXX_STD <= 202002L +# if CXX_STD <= CXX_STD_20 Outputter o; # endif #elif DEFAULT_CXX20 -# if CXX_STD <= 201703L +# if CXX_STD <= CXX_STD_17 Outputter o; # endif #elif DEFAULT_CXX17 -# if CXX_STD <= 201402L +# if CXX_STD <= CXX_STD_14 Outputter o; # endif #elif DEFAULT_CXX14 -# if CXX_STD != 201402L +# if CXX_STD <= CXX_STD_11 Outputter o; # endif #elif DEFAULT_CXX11 -# if CXX_STD != 201103L +# if CXX_STD != CXX_STD_11 Outputter o; # endif #else # if !DEFAULT_CXX98 # error Buildsystem error # endif -# if CXX_STD != 199711L && CXX_STD != 1 && \ +# if CXX_STD != CXX_STD_98 && CXX_STD != 1 && \ !defined(__GXX_EXPERIMENTAL_CXX0X__) Outputter o; # endif -- cgit v0.12