From f21dbf8f26189f62220ec191fcfea9711d3401c5 Mon Sep 17 00:00:00 2001 From: Raul Tambre Date: Mon, 25 Mar 2024 21:10:04 +0200 Subject: C++26: Fix C++/CUDA/HIP compile feature support In commit f808d8afb9 (CMake: Support upcoming C++26 language level, 2022-08-19, v3.25.0-rc1~218^2) we forgot some necessary scaffolding. Fixes: #25819 --- .gitlab/ci/configure_windows_clang_common.cmake | 2 +- Help/prop_gbl/CMAKE_CUDA_KNOWN_FEATURES.rst | 2 +- Help/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.rst | 2 +- Help/release/3.25.rst | 4 +--- Help/release/dev/cxx-26.rst | 8 ++++++++ Modules/CMakeCUDACompiler.cmake.in | 1 + Modules/CMakeCXXCompiler.cmake.in | 1 + Modules/CMakeHIPCompiler.cmake.in | 1 + Modules/Compiler/CMakeCommonCompilerMacros.cmake | 9 +++++++++ Tests/CompileFeatures/CMakeLists.txt | 2 +- Tests/CompileFeatures/cxx_std_26.cpp | 4 ++++ 11 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 Help/release/dev/cxx-26.rst create mode 100644 Tests/CompileFeatures/cxx_std_26.cpp diff --git a/.gitlab/ci/configure_windows_clang_common.cmake b/.gitlab/ci/configure_windows_clang_common.cmake index 8bef0d9..89d0c9c 100644 --- a/.gitlab/ci/configure_windows_clang_common.cmake +++ b/.gitlab/ci/configure_windows_clang_common.cmake @@ -1,6 +1,6 @@ if("$ENV{CMAKE_CI_BUILD_NAME}" MATCHES "(^|_)gnu(_|$)") set(CMake_TEST_C_STANDARDS "90;99;11;17;23" CACHE STRING "") - set(CMake_TEST_CXX_STANDARDS "98;11;14;17;20;23" CACHE STRING "") + set(CMake_TEST_CXX_STANDARDS "98;11;14;17;20;23;26" CACHE STRING "") else() # FIXME: Implement C23 and C++23 support for clang-cl. set(CMake_TEST_C_STANDARDS "90;99;11;17" CACHE STRING "") diff --git a/Help/prop_gbl/CMAKE_CUDA_KNOWN_FEATURES.rst b/Help/prop_gbl/CMAKE_CUDA_KNOWN_FEATURES.rst index a31ee3a..fd2f941 100644 --- a/Help/prop_gbl/CMAKE_CUDA_KNOWN_FEATURES.rst +++ b/Help/prop_gbl/CMAKE_CUDA_KNOWN_FEATURES.rst @@ -37,7 +37,7 @@ The features known to this version of CMake are: Compiler mode is at least CUDA/C++ 23. ``cuda_std_26`` - .. versionadded:: 3.25 + .. versionadded:: 3.30 Compiler mode is at least CUDA/C++ 26. diff --git a/Help/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.rst b/Help/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.rst index e54b927..177659a 100644 --- a/Help/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.rst +++ b/Help/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.rst @@ -47,7 +47,7 @@ but it does not necessarily imply complete conformance to that standard. Compiler mode is at least C++ 23. ``cxx_std_26`` - .. versionadded:: 3.25 + .. versionadded:: 3.30 Compiler mode is at least C++ 26. diff --git a/Help/release/3.25.rst b/Help/release/3.25.rst index cb6984c..646c5ba 100644 --- a/Help/release/3.25.rst +++ b/Help/release/3.25.rst @@ -27,9 +27,7 @@ Presets Languages --------- -* The :manual:`Compile Features ` functionality - is now aware of C++26, and defines a ``cxx_std_26`` meta-feature. - C++26 compiler modes may also be specified via the :prop_tgt:`CXX_STANDARD`, +* C++26 compiler modes may now be specified via the :prop_tgt:`CXX_STANDARD`, :prop_tgt:`CUDA_STANDARD`, :prop_tgt:`HIP_STANDARD`, or :prop_tgt:`OBJCXX_STANDARD` target properties. diff --git a/Help/release/dev/cxx-26.rst b/Help/release/dev/cxx-26.rst new file mode 100644 index 0000000..08e3fdd --- /dev/null +++ b/Help/release/dev/cxx-26.rst @@ -0,0 +1,8 @@ +cxx-26 +------ + +* The :manual:`Compile Features ` functionality + now implements support for the ``cxx_std_26`` and ``cuda_std_26`` + meta-features to indicate that the compiler mode must be at least C++26. + These meta-features were first documented by CMake 3.25, but were not fully + implemented. diff --git a/Modules/CMakeCUDACompiler.cmake.in b/Modules/CMakeCUDACompiler.cmake.in index 3af02a4..9260c64 100644 --- a/Modules/CMakeCUDACompiler.cmake.in +++ b/Modules/CMakeCUDACompiler.cmake.in @@ -14,6 +14,7 @@ set(CMAKE_CUDA14_COMPILE_FEATURES "@CMAKE_CUDA14_COMPILE_FEATURES@") set(CMAKE_CUDA17_COMPILE_FEATURES "@CMAKE_CUDA17_COMPILE_FEATURES@") set(CMAKE_CUDA20_COMPILE_FEATURES "@CMAKE_CUDA20_COMPILE_FEATURES@") set(CMAKE_CUDA23_COMPILE_FEATURES "@CMAKE_CUDA23_COMPILE_FEATURES@") +set(CMAKE_CUDA26_COMPILE_FEATURES "@CMAKE_CUDA26_COMPILE_FEATURES@") set(CMAKE_CUDA_PLATFORM_ID "@CMAKE_CUDA_PLATFORM_ID@") set(CMAKE_CUDA_SIMULATE_ID "@CMAKE_CUDA_SIMULATE_ID@") diff --git a/Modules/CMakeCXXCompiler.cmake.in b/Modules/CMakeCXXCompiler.cmake.in index 55f1113..d18e1c8 100644 --- a/Modules/CMakeCXXCompiler.cmake.in +++ b/Modules/CMakeCXXCompiler.cmake.in @@ -13,6 +13,7 @@ set(CMAKE_CXX14_COMPILE_FEATURES "@CMAKE_CXX14_COMPILE_FEATURES@") set(CMAKE_CXX17_COMPILE_FEATURES "@CMAKE_CXX17_COMPILE_FEATURES@") set(CMAKE_CXX20_COMPILE_FEATURES "@CMAKE_CXX20_COMPILE_FEATURES@") set(CMAKE_CXX23_COMPILE_FEATURES "@CMAKE_CXX23_COMPILE_FEATURES@") +set(CMAKE_CXX26_COMPILE_FEATURES "@CMAKE_CXX26_COMPILE_FEATURES@") set(CMAKE_CXX_PLATFORM_ID "@CMAKE_CXX_PLATFORM_ID@") set(CMAKE_CXX_SIMULATE_ID "@CMAKE_CXX_SIMULATE_ID@") diff --git a/Modules/CMakeHIPCompiler.cmake.in b/Modules/CMakeHIPCompiler.cmake.in index 9d70e03..c603a4d 100644 --- a/Modules/CMakeHIPCompiler.cmake.in +++ b/Modules/CMakeHIPCompiler.cmake.in @@ -12,6 +12,7 @@ set(CMAKE_HIP14_COMPILE_FEATURES "@CMAKE_HIP14_COMPILE_FEATURES@") set(CMAKE_HIP17_COMPILE_FEATURES "@CMAKE_HIP17_COMPILE_FEATURES@") set(CMAKE_HIP20_COMPILE_FEATURES "@CMAKE_HIP20_COMPILE_FEATURES@") set(CMAKE_HIP23_COMPILE_FEATURES "@CMAKE_HIP23_COMPILE_FEATURES@") +set(CMAKE_HIP26_COMPILE_FEATURES "@CMAKE_HIP26_COMPILE_FEATURES@") set(CMAKE_HIP_PLATFORM_ID "@CMAKE_HIP_PLATFORM_ID@") set(CMAKE_HIP_SIMULATE_ID "@CMAKE_HIP_SIMULATE_ID@") diff --git a/Modules/Compiler/CMakeCommonCompilerMacros.cmake b/Modules/Compiler/CMakeCommonCompilerMacros.cmake index 2f220d4..02c2b18 100644 --- a/Modules/Compiler/CMakeCommonCompilerMacros.cmake +++ b/Modules/Compiler/CMakeCommonCompilerMacros.cmake @@ -105,6 +105,9 @@ endmacro() # Define to allow compile features to be automatically determined macro(cmake_record_cxx_compile_features) set(_result 0) + if(_result EQUAL 0 AND DEFINED CMAKE_CXX26_STANDARD_COMPILE_OPTION) + _has_compiler_features_cxx(26) + endif() if(_result EQUAL 0 AND DEFINED CMAKE_CXX23_STANDARD_COMPILE_OPTION) _has_compiler_features_cxx(23) endif() @@ -142,6 +145,9 @@ endmacro() macro(cmake_record_cuda_compile_features) set(_result 0) + if(_result EQUAL 0 AND DEFINED CMAKE_CUDA26_STANDARD_COMPILE_OPTION) + _has_compiler_features_cuda(26) + endif() if(_result EQUAL 0 AND DEFINED CMAKE_CUDA23_STANDARD_COMPILE_OPTION) _has_compiler_features_cuda(23) endif() @@ -179,6 +185,9 @@ endmacro() macro(cmake_record_hip_compile_features) set(_result 0) + if(_result EQUAL 0 AND DEFINED CMAKE_HIP26_STANDARD_COMPILE_OPTION) + _has_compiler_features_hip(26) + endif() if(_result EQUAL 0 AND DEFINED CMAKE_HIP23_STANDARD_COMPILE_OPTION) _has_compiler_features_hip(23) endif() diff --git a/Tests/CompileFeatures/CMakeLists.txt b/Tests/CompileFeatures/CMakeLists.txt index a33fad3..e206e70 100644 --- a/Tests/CompileFeatures/CMakeLists.txt +++ b/Tests/CompileFeatures/CMakeLists.txt @@ -7,7 +7,7 @@ project(CompileFeatures) set(ext_C c) set(ext_CXX cpp) set(std_C 90 99 11 17 23) -set(std_CXX 98 11 14 17 20 23) +set(std_CXX 98 11 14 17 20 23 26) foreach(lang C CXX) foreach(std IN LISTS std_${lang}) diff --git a/Tests/CompileFeatures/cxx_std_26.cpp b/Tests/CompileFeatures/cxx_std_26.cpp new file mode 100644 index 0000000..db3f6bc --- /dev/null +++ b/Tests/CompileFeatures/cxx_std_26.cpp @@ -0,0 +1,4 @@ +#include "cxx_std.h" +#if defined(CXX_STD) && CXX_STD <= CXX_STD_23 +# error "cxx_std_26 not honored" +#endif -- cgit v0.12