From 3ca7f37e5ac361703ac95dad4a1af069d11e12dc Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 3 Apr 2024 19:32:52 -0400 Subject: Intel: Fix classic compiler version check for C++20 flag The `-std=c++20` flag was added by Intel compiler 2019 update 3. --- Modules/Compiler/Intel-CXX.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Compiler/Intel-CXX.cmake b/Modules/Compiler/Intel-CXX.cmake index 7c9cca9..7666b2d 100644 --- a/Modules/Compiler/Intel-CXX.cmake +++ b/Modules/Compiler/Intel-CXX.cmake @@ -51,7 +51,7 @@ else() set(CMAKE_CXX_COMPILE_OPTIONS_EXPLICIT_LANGUAGE -x c++) - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0.0) + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0.0.20190206) set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++20") set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++20") endif() -- cgit v0.12 From 529ccb3dff96d18fc1a13ae7bc65eb82a18ff1e8 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 3 Apr 2024 16:49:03 -0400 Subject: IntelLLVM: Use C23 and C++23 flags only versions supporting them Revise commit 4331f7b4bf (IntelLLVM: Add provisional flags for C23 and C++23, 2023-01-12, v3.26.0-rc1~86^2). --- Modules/Compiler/IntelLLVM-C.cmake | 12 ++++++++---- Modules/Compiler/IntelLLVM-CXX.cmake | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Modules/Compiler/IntelLLVM-C.cmake b/Modules/Compiler/IntelLLVM-C.cmake index 3a81154..06059eb 100644 --- a/Modules/Compiler/IntelLLVM-C.cmake +++ b/Modules/Compiler/IntelLLVM-C.cmake @@ -42,8 +42,10 @@ if(NOT "x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC") set(CMAKE_C17_STANDARD_COMPILE_OPTION "-std=c17") set(CMAKE_C17_EXTENSION_COMPILE_OPTION "-std=gnu17") - set(CMAKE_C23_STANDARD_COMPILE_OPTION "-std=c2x") - set(CMAKE_C23_EXTENSION_COMPILE_OPTION "-std=gnu2x") + if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 2022.1.0) + set(CMAKE_C23_STANDARD_COMPILE_OPTION "-std=c2x") + set(CMAKE_C23_EXTENSION_COMPILE_OPTION "-std=gnu2x") + endif() else() # clang-cl doesn't have any of these set(CMAKE_C90_STANDARD_COMPILE_OPTION "") @@ -58,8 +60,10 @@ else() set(CMAKE_C17_STANDARD_COMPILE_OPTION "") set(CMAKE_C17_EXTENSION_COMPILE_OPTION "") - set(CMAKE_C23_STANDARD_COMPILE_OPTION "") - set(CMAKE_C23_EXTENSION_COMPILE_OPTION "") + if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 2022.1.0) + set(CMAKE_C23_STANDARD_COMPILE_OPTION "") + set(CMAKE_C23_EXTENSION_COMPILE_OPTION "") + endif() endif() __compiler_check_default_language_standard(C 2020 17) diff --git a/Modules/Compiler/IntelLLVM-CXX.cmake b/Modules/Compiler/IntelLLVM-CXX.cmake index 45b723f..bd92139 100644 --- a/Modules/Compiler/IntelLLVM-CXX.cmake +++ b/Modules/Compiler/IntelLLVM-CXX.cmake @@ -47,8 +47,10 @@ if(NOT "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++20") set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++20") - set(CMAKE_CXX23_STANDARD_COMPILE_OPTION "-std=c++2b") - set(CMAKE_CXX23_EXTENSION_COMPILE_OPTION "-std=gnu++2b") + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 2021.2.0) + set(CMAKE_CXX23_STANDARD_COMPILE_OPTION "-std=c++2b") + set(CMAKE_CXX23_EXTENSION_COMPILE_OPTION "-std=gnu++2b") + endif() else() set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "") set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "") @@ -65,8 +67,10 @@ else() set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-Qstd:c++20") set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-Qstd:c++20") - set(CMAKE_CXX23_STANDARD_COMPILE_OPTION "-Qstd:c++2b") - set(CMAKE_CXX23_EXTENSION_COMPILE_OPTION "-Qstd:c++2b") + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 2021.2.0) + set(CMAKE_CXX23_STANDARD_COMPILE_OPTION "-Qstd:c++2b") + set(CMAKE_CXX23_EXTENSION_COMPILE_OPTION "-Qstd:c++2b") + endif() endif() __compiler_check_default_language_standard(CXX 2020 14) -- cgit v0.12 From ae18811f2e1e12de8c2dc9c1168de1859c38dca2 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 3 Apr 2024 18:52:45 -0400 Subject: IntelLLVM: Add C standard flags on Windows --- Modules/Compiler/IntelLLVM-C.cmake | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Modules/Compiler/IntelLLVM-C.cmake b/Modules/Compiler/IntelLLVM-C.cmake index 06059eb..f783d81 100644 --- a/Modules/Compiler/IntelLLVM-C.cmake +++ b/Modules/Compiler/IntelLLVM-C.cmake @@ -47,22 +47,21 @@ if(NOT "x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC") set(CMAKE_C23_EXTENSION_COMPILE_OPTION "-std=gnu2x") endif() else() - # clang-cl doesn't have any of these - set(CMAKE_C90_STANDARD_COMPILE_OPTION "") - set(CMAKE_C90_EXTENSION_COMPILE_OPTION "") + set(CMAKE_C90_STANDARD_COMPILE_OPTION "-Qstd:c90") + set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-Qstd:c90") - set(CMAKE_C99_STANDARD_COMPILE_OPTION "") - set(CMAKE_C99_EXTENSION_COMPILE_OPTION "") + set(CMAKE_C99_STANDARD_COMPILE_OPTION "-Qstd:c99") + set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-Qstd:c99") - set(CMAKE_C11_STANDARD_COMPILE_OPTION "") - set(CMAKE_C11_EXTENSION_COMPILE_OPTION "") + set(CMAKE_C11_STANDARD_COMPILE_OPTION "-Qstd:c11") + set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-Qstd:c11") - set(CMAKE_C17_STANDARD_COMPILE_OPTION "") - set(CMAKE_C17_EXTENSION_COMPILE_OPTION "") + set(CMAKE_C17_STANDARD_COMPILE_OPTION "-Qstd:c17") + set(CMAKE_C17_EXTENSION_COMPILE_OPTION "-Qstd:c17") if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 2022.1.0) - set(CMAKE_C23_STANDARD_COMPILE_OPTION "") - set(CMAKE_C23_EXTENSION_COMPILE_OPTION "") + set(CMAKE_C23_STANDARD_COMPILE_OPTION "-Qstd:c2x") + set(CMAKE_C23_EXTENSION_COMPILE_OPTION "-Qstd:c2x") endif() endif() -- cgit v0.12 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 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 From 863cde8c19d63177da2212f06a0b7d93279e04c9 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 4 Apr 2024 17:45:01 -0400 Subject: Intel: Fix detection of C++ 14/17 modes on Linux/macOS The Intel Classic C++ compiler is based on EDG. It does not always define `__cplusplus` correctly, but does define feature macros that we can use to distinguish these modes. --- Modules/CMakeCXXCompilerId.cpp.in | 8 ++++++++ Tests/CompileFeatures/default_dialect.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/Modules/CMakeCXXCompilerId.cpp.in b/Modules/CMakeCXXCompilerId.cpp.in index e83cfe6..3a334ed 100644 --- a/Modules/CMakeCXXCompilerId.cpp.in +++ b/Modules/CMakeCXXCompilerId.cpp.in @@ -58,6 +58,14 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; # endif #elif defined(_MSC_VER) && defined(_MSVC_LANG) # define CXX_STD _MSVC_LANG +#elif defined(__INTEL_COMPILER) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif #else # define CXX_STD __cplusplus #endif diff --git a/Tests/CompileFeatures/default_dialect.cpp b/Tests/CompileFeatures/default_dialect.cpp index 3f95b6c..82a8698 100644 --- a/Tests/CompileFeatures/default_dialect.cpp +++ b/Tests/CompileFeatures/default_dialect.cpp @@ -27,6 +27,14 @@ struct Outputter; # endif #elif defined(_MSC_VER) && defined(_MSVC_LANG) # define CXX_STD _MSVC_LANG +#elif defined(__INTEL_COMPILER) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif #else # define CXX_STD __cplusplus #endif -- cgit v0.12 From 3587579f34235255db11a2d2b11668829f256790 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 3 Apr 2024 14:26:18 -0400 Subject: XL/XLClang: Fix detection of C++ 14 mode on Linux This compiler does not always define `__cplusplus` correctly, but does define a feature macro that we can use to distinguish this mode. --- Modules/CMakeCXXCompilerId.cpp.in | 6 ++++++ Tests/CompileFeatures/default_dialect.cpp | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/Modules/CMakeCXXCompilerId.cpp.in b/Modules/CMakeCXXCompilerId.cpp.in index 3a334ed..2a92287 100644 --- a/Modules/CMakeCXXCompilerId.cpp.in +++ b/Modules/CMakeCXXCompilerId.cpp.in @@ -66,6 +66,12 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; # else # define CXX_STD __cplusplus # endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif #else # define CXX_STD __cplusplus #endif diff --git a/Tests/CompileFeatures/default_dialect.cpp b/Tests/CompileFeatures/default_dialect.cpp index 82a8698..081b049 100644 --- a/Tests/CompileFeatures/default_dialect.cpp +++ b/Tests/CompileFeatures/default_dialect.cpp @@ -35,6 +35,12 @@ struct Outputter; # else # define CXX_STD __cplusplus # endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif #else # define CXX_STD __cplusplus #endif -- cgit v0.12 From 7f05d472a2f2c84baa4996b3464f690565f8ab3a Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 5 Apr 2024 07:07:16 -0400 Subject: NVHPC: Fix detection of C++ 20 mode on NVHPC < 22.7 This compiler does not always define `__cplusplus` correctly, but does define a feature macro that we can use to distinguish this mode. --- Modules/CMakeCXXCompilerId.cpp.in | 6 ++++++ Tests/CompileFeatures/default_dialect.cpp | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/Modules/CMakeCXXCompilerId.cpp.in b/Modules/CMakeCXXCompilerId.cpp.in index 2a92287..71cc182 100644 --- a/Modules/CMakeCXXCompilerId.cpp.in +++ b/Modules/CMakeCXXCompilerId.cpp.in @@ -58,6 +58,12 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; # endif #elif defined(_MSC_VER) && defined(_MSVC_LANG) # define CXX_STD _MSVC_LANG +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif #elif defined(__INTEL_COMPILER) # if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) # define CXX_STD CXX_STD_17 diff --git a/Tests/CompileFeatures/default_dialect.cpp b/Tests/CompileFeatures/default_dialect.cpp index 081b049..bdd5cac 100644 --- a/Tests/CompileFeatures/default_dialect.cpp +++ b/Tests/CompileFeatures/default_dialect.cpp @@ -27,6 +27,12 @@ struct Outputter; # endif #elif defined(_MSC_VER) && defined(_MSVC_LANG) # define CXX_STD _MSVC_LANG +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif #elif defined(__INTEL_COMPILER) # if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) # define CXX_STD CXX_STD_17 -- cgit v0.12 From c9cc3dc6460e32741f42d015343a65beca7482c9 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 3 Apr 2024 14:26:18 -0400 Subject: PGI: Fix detection of C++ 14/17 modes The PGI compiler is based on EDG. Share conditions with Intel Classic. --- Modules/CMakeCXXCompilerId.cpp.in | 2 +- Tests/CompileFeatures/default_dialect.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/CMakeCXXCompilerId.cpp.in b/Modules/CMakeCXXCompilerId.cpp.in index 71cc182..b77e0e5 100644 --- a/Modules/CMakeCXXCompilerId.cpp.in +++ b/Modules/CMakeCXXCompilerId.cpp.in @@ -64,7 +64,7 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; # else # define CXX_STD __cplusplus # endif -#elif defined(__INTEL_COMPILER) +#elif defined(__INTEL_COMPILER) || defined(__PGI) # if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) # define CXX_STD CXX_STD_17 # elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) diff --git a/Tests/CompileFeatures/default_dialect.cpp b/Tests/CompileFeatures/default_dialect.cpp index bdd5cac..b3ac4e7 100644 --- a/Tests/CompileFeatures/default_dialect.cpp +++ b/Tests/CompileFeatures/default_dialect.cpp @@ -33,7 +33,7 @@ struct Outputter; # else # define CXX_STD __cplusplus # endif -#elif defined(__INTEL_COMPILER) +#elif defined(__INTEL_COMPILER) || defined(__PGI) # if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) # define CXX_STD CXX_STD_17 # elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) -- cgit v0.12 From 80a5a865142a48bd25e27533683d040adc7d885a Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 3 Apr 2024 14:26:18 -0400 Subject: GNU: Fix detection of C++ 11 mode in GCC 4.{4,5,6} These versions of the compiler have experimental C++11 support and so do not define `__cplusplus` correctly, but do define a feature macro we can use to distinguish this mode. --- Modules/CMakeCXXCompilerId.cpp.in | 2 ++ Tests/CompileFeatures/default_dialect.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Modules/CMakeCXXCompilerId.cpp.in b/Modules/CMakeCXXCompilerId.cpp.in index b77e0e5..390bf4e 100644 --- a/Modules/CMakeCXXCompilerId.cpp.in +++ b/Modules/CMakeCXXCompilerId.cpp.in @@ -78,6 +78,8 @@ char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; # else # define CXX_STD __cplusplus # endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 #else # define CXX_STD __cplusplus #endif diff --git a/Tests/CompileFeatures/default_dialect.cpp b/Tests/CompileFeatures/default_dialect.cpp index b3ac4e7..f9b770b 100644 --- a/Tests/CompileFeatures/default_dialect.cpp +++ b/Tests/CompileFeatures/default_dialect.cpp @@ -47,6 +47,8 @@ struct Outputter; # else # define CXX_STD __cplusplus # endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 #else # define CXX_STD __cplusplus #endif -- cgit v0.12