From 1e774a86d3693b6250e53bf67d3d30b07dddf7b2 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 3 Apr 2024 14:26:18 -0400 Subject: 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. --- Modules/CMakeCXXCompilerId.cpp.in | 21 +++++++++++++-------- Tests/CompileFeatures/default_dialect.cpp | 21 +++++++++++++-------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/Modules/CMakeCXXCompilerId.cpp.in b/Modules/CMakeCXXCompilerId.cpp.in index 948209a..e83cfe6 100644 --- a/Modules/CMakeCXXCompilerId.cpp.in +++ b/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 diff --git a/Tests/CompileFeatures/default_dialect.cpp b/Tests/CompileFeatures/default_dialect.cpp index 88cc12d..3f95b6c 100644 --- a/Tests/CompileFeatures/default_dialect.cpp +++ b/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 -- cgit v0.12