Ver Fonte

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
Raul Tambre há 1 ano atrás
pai
commit
f21dbf8f26

+ 1 - 1
.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 "")

+ 1 - 1
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.
 

+ 1 - 1
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.
 

+ 1 - 3
Help/release/3.25.rst

@@ -27,9 +27,7 @@ Presets
 Languages
 ---------
 
-* The :manual:`Compile Features <cmake-compile-features(7)>` 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.
 

+ 8 - 0
Help/release/dev/cxx-26.rst

@@ -0,0 +1,8 @@
+cxx-26
+------
+
+* The :manual:`Compile Features <cmake-compile-features(7)>` 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.

+ 1 - 0
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@")

+ 1 - 0
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@")

+ 1 - 0
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@")

+ 9 - 0
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()

+ 1 - 1
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})

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