Browse Source

CompilerId: Clarify C and C++ standard level detection

Use named constants.  Regularize comparison patterns.
Brad King 1 year ago
parent
commit
b9d4db7098

+ 13 - 4
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"

+ 17 - 9
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"

+ 12 - 4
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

+ 18 - 10
Tests/CompileFeatures/default_dialect.cpp

@@ -2,15 +2,23 @@
 template <long l>
 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<CXX_STD> o;
 #  endif
 #elif DEFAULT_CXX20
-#  if CXX_STD <= 201703L
+#  if CXX_STD <= CXX_STD_17
 Outputter<CXX_STD> o;
 #  endif
 #elif DEFAULT_CXX17
-#  if CXX_STD <= 201402L
+#  if CXX_STD <= CXX_STD_14
 Outputter<CXX_STD> o;
 #  endif
 #elif DEFAULT_CXX14
-#  if CXX_STD != 201402L
+#  if CXX_STD <= CXX_STD_11
 Outputter<CXX_STD> o;
 #  endif
 #elif DEFAULT_CXX11
-#  if CXX_STD != 201103L
+#  if CXX_STD != CXX_STD_11
 Outputter<CXX_STD> 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<CXX_STD> o;
 #  endif