Browse Source

Intel: Fix detection of C++ 17/20 modes on Windows

The Intel Classic C++ compiler for Windows does not always define
`_MSVC_LANG` correctly, but does define feature macros that we can use
to distinguish these modes.
Brad King 1 year ago
parent
commit
1e774a86d3
2 changed files with 26 additions and 16 deletions
  1. 13 8
      Modules/CMakeCXXCompilerId.cpp.in
  2. 13 8
      Tests/CompileFeatures/default_dialect.cpp

+ 13 - 8
Modules/CMakeCXXCompilerId.cpp.in

@@ -40,14 +40,19 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]";
 #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 CXX_STD_14
-#    else
-#      define CXX_STD CXX_STD_11
-#    endif
+#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG)
+#  if _MSVC_LANG > CXX_STD_17
+#    define CXX_STD _MSVC_LANG
+#  elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init)
+#    define CXX_STD CXX_STD_20
+#  elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17
+#    define CXX_STD CXX_STD_20
+#  elif _MSVC_LANG > CXX_STD_14
+#    define CXX_STD CXX_STD_17
+#  elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi)
+#    define CXX_STD CXX_STD_14
+#  elif defined(__INTEL_CXX11_MODE__)
+#    define CXX_STD CXX_STD_11
 #  else
 #    define CXX_STD CXX_STD_98
 #  endif

+ 13 - 8
Tests/CompileFeatures/default_dialect.cpp

@@ -9,14 +9,19 @@ struct Outputter;
 #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 CXX_STD_14
-#    else
-#      define CXX_STD CXX_STD_11
-#    endif
+#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG)
+#  if _MSVC_LANG > CXX_STD_17
+#    define CXX_STD _MSVC_LANG
+#  elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init)
+#    define CXX_STD CXX_STD_20
+#  elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17
+#    define CXX_STD CXX_STD_20
+#  elif _MSVC_LANG > CXX_STD_14
+#    define CXX_STD CXX_STD_17
+#  elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi)
+#    define CXX_STD CXX_STD_14
+#  elif defined(__INTEL_CXX11_MODE__)
+#    define CXX_STD CXX_STD_11
 #  else
 #    define CXX_STD CXX_STD_98
 #  endif