1
0
Эх сурвалжийг харах

Merge topic 'lang-standard-latest'

7c38e6bb52 Add CMAKE_<LANG>_STANDARD_LATEST variables
fddb165c6c AppleClang: Fix Objective C 23 support detection
1dff17108d Modules: Fix ARMClang and TIClang language standard compile options

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !9314
Brad King 1 жил өмнө
parent
commit
cab2a6634d
79 өөрчлөгдсөн 492 нэмэгдсэн , 51 устгасан
  1. 1 0
      Help/manual/cmake-variables.7.rst
  2. 5 0
      Help/release/dev/lang-standard-latest.rst
  3. 64 0
      Help/variable/CMAKE_LANG_STANDARD_LATEST.rst
  4. 1 0
      Modules/CMakeCCompiler.cmake.in
  5. 1 0
      Modules/CMakeCUDACompiler.cmake.in
  6. 1 0
      Modules/CMakeCXXCompiler.cmake.in
  7. 1 0
      Modules/CMakeHIPCompiler.cmake.in
  8. 1 0
      Modules/CMakeOBJCCompiler.cmake.in
  9. 1 0
      Modules/CMakeOBJCXXCompiler.cmake.in
  10. 2 0
      Modules/Compiler/ADSP-C.cmake
  11. 2 0
      Modules/Compiler/ADSP-CXX.cmake
  12. 10 0
      Modules/Compiler/ARMClang-C.cmake
  13. 4 0
      Modules/Compiler/AppleClang-C.cmake
  14. 9 0
      Modules/Compiler/AppleClang-CXX.cmake
  15. 7 1
      Modules/Compiler/AppleClang-OBJC.cmake
  16. 7 0
      Modules/Compiler/AppleClang-OBJCXX.cmake
  17. 9 0
      Modules/Compiler/Clang-C.cmake
  18. 6 0
      Modules/Compiler/Clang-OBJC.cmake
  19. 23 0
      Modules/Compiler/Clang.cmake
  20. 2 0
      Modules/Compiler/Cray-C.cmake
  21. 3 0
      Modules/Compiler/Cray-CXX.cmake
  22. 2 0
      Modules/Compiler/CrayClang-C.cmake
  23. 2 0
      Modules/Compiler/CrayClang-CXX.cmake
  24. 2 0
      Modules/Compiler/Fujitsu-C.cmake
  25. 2 0
      Modules/Compiler/Fujitsu-CXX.cmake
  26. 1 0
      Modules/Compiler/GNU-OBJC.cmake
  27. 1 0
      Modules/Compiler/GNU-OBJCXX.cmake
  28. 17 0
      Modules/Compiler/GNU.cmake
  29. 3 0
      Modules/Compiler/IBMClang-C.cmake
  30. 3 0
      Modules/Compiler/IBMClang-CXX.cmake
  31. 16 12
      Modules/Compiler/Intel-C.cmake
  32. 49 38
      Modules/Compiler/Intel-CXX.cmake
  33. 6 0
      Modules/Compiler/IntelLLVM-C.cmake
  34. 6 0
      Modules/Compiler/IntelLLVM-CXX.cmake
  35. 4 0
      Modules/Compiler/LCC-C.cmake
  36. 6 0
      Modules/Compiler/LCC-CXX.cmake
  37. 4 0
      Modules/Compiler/MSVC-C.cmake
  38. 12 0
      Modules/Compiler/MSVC-CXX.cmake
  39. 1 0
      Modules/Compiler/NVHPC-C.cmake
  40. 1 0
      Modules/Compiler/NVHPC-CXX.cmake
  41. 12 0
      Modules/Compiler/NVIDIA.cmake
  42. 2 0
      Modules/Compiler/OrangeC-C.cmake
  43. 2 0
      Modules/Compiler/OrangeC-CXX.cmake
  44. 3 0
      Modules/Compiler/PGI-C.cmake
  45. 4 0
      Modules/Compiler/PGI-CXX.cmake
  46. 4 0
      Modules/Compiler/SunPro-C.cmake
  47. 4 0
      Modules/Compiler/SunPro-CXX.cmake
  48. 5 0
      Modules/Compiler/TI-C.cmake
  49. 3 0
      Modules/Compiler/TI-CXX.cmake
  50. 10 0
      Modules/Compiler/TIClang-C.cmake
  51. 13 0
      Modules/Compiler/TIClang-CXX.cmake
  52. 2 0
      Modules/Compiler/Tasking-C.cmake
  53. 2 0
      Modules/Compiler/Tasking-CXX.cmake
  54. 3 0
      Modules/Compiler/XL-C.cmake
  55. 3 0
      Modules/Compiler/XL-CXX.cmake
  56. 3 0
      Modules/Compiler/XLClang-C.cmake
  57. 5 0
      Modules/Compiler/XLClang-CXX.cmake
  58. 10 0
      Tests/RunCMake/CMakeLists.txt
  59. 3 0
      Tests/RunCMake/LanguageStandards/CMakeLists.txt
  60. 14 0
      Tests/RunCMake/LanguageStandards/Inspect.cmake
  61. 32 0
      Tests/RunCMake/LanguageStandards/RunCMakeTest.cmake
  62. 1 0
      Tests/RunCMake/LanguageStandards/StdLatest-C-stdout.txt
  63. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-C.c
  64. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-C.cmake
  65. 1 0
      Tests/RunCMake/LanguageStandards/StdLatest-CUDA-stdout.txt
  66. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-CUDA.cmake
  67. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-CUDA.cu
  68. 1 0
      Tests/RunCMake/LanguageStandards/StdLatest-CXX-stdout.txt
  69. 5 0
      Tests/RunCMake/LanguageStandards/StdLatest-CXX.cmake
  70. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-CXX.cxx
  71. 1 0
      Tests/RunCMake/LanguageStandards/StdLatest-HIP-stdout.txt
  72. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-HIP.cmake
  73. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-HIP.hip
  74. 1 0
      Tests/RunCMake/LanguageStandards/StdLatest-OBJC-stdout.txt
  75. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-OBJC.cmake
  76. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-OBJC.m
  77. 1 0
      Tests/RunCMake/LanguageStandards/StdLatest-OBJCXX-stdout.txt
  78. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-OBJCXX.cmake
  79. 4 0
      Tests/RunCMake/LanguageStandards/StdLatest-OBJCXX.mm

+ 1 - 0
Help/manual/cmake-variables.7.rst

@@ -645,6 +645,7 @@ Variables for Languages
    /variable/CMAKE_LANG_STANDARD
    /variable/CMAKE_LANG_STANDARD_DEFAULT
    /variable/CMAKE_LANG_STANDARD_INCLUDE_DIRECTORIES
+   /variable/CMAKE_LANG_STANDARD_LATEST
    /variable/CMAKE_LANG_STANDARD_LIBRARIES
    /variable/CMAKE_LANG_STANDARD_REQUIRED
    /variable/CMAKE_OBJC_EXTENSIONS

+ 5 - 0
Help/release/dev/lang-standard-latest.rst

@@ -0,0 +1,5 @@
+lang-standard-latest
+--------------------
+
+* The :variable:`CMAKE_<LANG>_STANDARD_LATEST` variable was added to
+  describe the latest supported standard of language ``<LANG>``.

+ 64 - 0
Help/variable/CMAKE_LANG_STANDARD_LATEST.rst

@@ -0,0 +1,64 @@
+CMAKE_<LANG>_STANDARD_LATEST
+-----------------------------
+
+.. versionadded:: 3.30
+
+This variable represents the minimum between the latest version of the
+standard for language ``<LANG>`` which is supported by the current compiler
+and the latest version which is supported by CMake. Its value will be set to
+one of the supported values of the corresponding :prop_tgt:`<LANG>_STANDARD`
+target property; see the documentation of that property for a list of
+supported languages.
+
+See the :manual:`cmake-compile-features(7)` manual for information on compile
+features and a list of supported compilers.
+
+.. note::
+
+  ``CMAKE_<LANG>_STANDARD_LATEST`` will never be set to a language standard
+  which CMake recognizes but provides no support for. Unless explicitly
+  stated otherwise, every value which is supported by the corresponding
+  :prop_tgt:`<LANG>_STANDARD` target property represents a standard of
+  language ``<LANG>`` which is both recognized and supported by CMake.
+
+Checking for Language Standard Support
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+It is possible to use the value of the ``CMAKE_<LANG>_STANDARD_LATEST``
+variable to check for language standard support. This can be used to, e.g.,
+conditionally enable optional features for a distributed library.
+
+When doing so, one should be careful to **not** rely on integer value
+comparisons between standard levels. This is because some older standards of
+a given language which are supported by CMake (e.g., C++98, represented as
+``98``) will have a higher numerical value than newer standards of that same
+language.
+
+The following code sample demonstrates how one might correctly check for
+C++17 support:
+
+.. code-block:: cmake
+
+  # Careful! We cannot do direct integer comparisons with
+  # CMAKE_CXX_STANDARD_LATEST because some earlier C++ standards (e.g.,
+  # C++98) will have a higher numerical value than our requirement (C++17).
+  #
+  # Instead, we keep a list of unsupported C++ standards and check if
+  # CMAKE_CXX_STANDARD_LATEST appears in that list.
+  set(UNSUPPORTED_CXX_STANDARDS
+    98
+    11
+    14
+  )
+
+  list(FIND UNSUPPORTED_CXX_STANDARDS ${CMAKE_CXX_STANDARD_LATEST} UNSUPPORTED_CXX_STANDARDS_INDEX)
+
+  if(UNSUPPORTED_CXX_STANDARDS_INDEX EQUAL -1)
+    # We know that the current compiler supports at least C++17. Enabling
+    # some optional feature...
+  else()
+    message(STATUS
+      "Feature X is disabled because it requires C++17, but the current "
+      "compiler only supports C++${CMAKE_CXX_STANDARD_LATEST}."
+    )
+  endif()

+ 1 - 0
Modules/CMakeCCompiler.cmake.in

@@ -6,6 +6,7 @@ set(CMAKE_C_COMPILER_VERSION_INTERNAL "@CMAKE_C_COMPILER_VERSION_INTERNAL@")
 set(CMAKE_C_COMPILER_WRAPPER "@CMAKE_C_COMPILER_WRAPPER@")
 set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "@CMAKE_C_STANDARD_COMPUTED_DEFAULT@")
 set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "@CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT@")
+set(CMAKE_C_STANDARD_LATEST "@CMAKE_C_STANDARD_LATEST@")
 set(CMAKE_C_COMPILE_FEATURES "@CMAKE_C_COMPILE_FEATURES@")
 set(CMAKE_C90_COMPILE_FEATURES "@CMAKE_C90_COMPILE_FEATURES@")
 set(CMAKE_C99_COMPILE_FEATURES "@CMAKE_C99_COMPILE_FEATURES@")

+ 1 - 0
Modules/CMakeCUDACompiler.cmake.in

@@ -7,6 +7,7 @@ set(CMAKE_CUDA_DEVICE_LINKER "@CMAKE_CUDA_DEVICE_LINKER@")
 set(CMAKE_CUDA_FATBINARY "@CMAKE_CUDA_FATBINARY@")
 set(CMAKE_CUDA_STANDARD_COMPUTED_DEFAULT "@CMAKE_CUDA_STANDARD_COMPUTED_DEFAULT@")
 set(CMAKE_CUDA_EXTENSIONS_COMPUTED_DEFAULT "@CMAKE_CUDA_EXTENSIONS_COMPUTED_DEFAULT@")
+set(CMAKE_CUDA_STANDARD_LATEST "@CMAKE_CUDA_STANDARD_LATEST@")
 set(CMAKE_CUDA_COMPILE_FEATURES "@CMAKE_CUDA_COMPILE_FEATURES@")
 set(CMAKE_CUDA03_COMPILE_FEATURES "@CMAKE_CUDA03_COMPILE_FEATURES@")
 set(CMAKE_CUDA11_COMPILE_FEATURES "@CMAKE_CUDA11_COMPILE_FEATURES@")

+ 1 - 0
Modules/CMakeCXXCompiler.cmake.in

@@ -6,6 +6,7 @@ set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "@CMAKE_CXX_COMPILER_VERSION_INTERNAL@")
 set(CMAKE_CXX_COMPILER_WRAPPER "@CMAKE_CXX_COMPILER_WRAPPER@")
 set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "@CMAKE_CXX_STANDARD_COMPUTED_DEFAULT@")
 set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "@CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT@")
+set(CMAKE_CXX_STANDARD_LATEST "@CMAKE_CXX_STANDARD_LATEST@")
 set(CMAKE_CXX_COMPILE_FEATURES "@CMAKE_CXX_COMPILE_FEATURES@")
 set(CMAKE_CXX98_COMPILE_FEATURES "@CMAKE_CXX98_COMPILE_FEATURES@")
 set(CMAKE_CXX11_COMPILE_FEATURES "@CMAKE_CXX11_COMPILE_FEATURES@")

+ 1 - 0
Modules/CMakeHIPCompiler.cmake.in

@@ -5,6 +5,7 @@ set(CMAKE_HIP_COMPILER_ID "@CMAKE_HIP_COMPILER_ID@")
 set(CMAKE_HIP_COMPILER_VERSION "@CMAKE_HIP_COMPILER_VERSION@")
 set(CMAKE_HIP_STANDARD_COMPUTED_DEFAULT "@CMAKE_HIP_STANDARD_COMPUTED_DEFAULT@")
 set(CMAKE_HIP_EXTENSIONS_COMPUTED_DEFAULT "@CMAKE_HIP_EXTENSIONS_COMPUTED_DEFAULT@")
+set(CMAKE_HIP_STANDARD_LATEST "@CMAKE_HIP_STANDARD_LATEST@")
 set(CMAKE_HIP_COMPILE_FEATURES "@CMAKE_HIP_COMPILE_FEATURES@")
 set(CMAKE_HIP98_COMPILE_FEATURES "@CMAKE_HIP03_COMPILE_FEATURES@")
 set(CMAKE_HIP11_COMPILE_FEATURES "@CMAKE_HIP11_COMPILE_FEATURES@")

+ 1 - 0
Modules/CMakeOBJCCompiler.cmake.in

@@ -6,6 +6,7 @@ set(CMAKE_OBJC_COMPILER_VERSION_INTERNAL "@CMAKE_OBJC_COMPILER_VERSION_INTERNAL@
 set(CMAKE_OBJC_COMPILER_WRAPPER "@CMAKE_OBJC_COMPILER_WRAPPER@")
 set(CMAKE_OBJC_STANDARD_COMPUTED_DEFAULT "@CMAKE_OBJC_STANDARD_COMPUTED_DEFAULT@")
 set(CMAKE_OBJC_EXTENSIONS_COMPUTED_DEFAULT "@CMAKE_OBJC_EXTENSIONS_COMPUTED_DEFAULT@")
+set(CMAKE_OBJC_STANDARD_LATEST "@CMAKE_OBJC_STANDARD_LATEST@")
 set(CMAKE_OBJC_COMPILE_FEATURES "@CMAKE_OBJC_COMPILE_FEATURES@")
 set(CMAKE_OBJC90_COMPILE_FEATURES "@CMAKE_OBJC90_COMPILE_FEATURES@")
 set(CMAKE_OBJC99_COMPILE_FEATURES "@CMAKE_OBJC99_COMPILE_FEATURES@")

+ 1 - 0
Modules/CMakeOBJCXXCompiler.cmake.in

@@ -6,6 +6,7 @@ set(CMAKE_OBJCXX_COMPILER_VERSION_INTERNAL "@CMAKE_OBJCXX_COMPILER_VERSION_INTER
 set(CMAKE_OBJCXX_COMPILER_WRAPPER "@CMAKE_OBJCXX_COMPILER_WRAPPER@")
 set(CMAKE_OBJCXX_STANDARD_COMPUTED_DEFAULT "@CMAKE_OBJCXX_STANDARD_COMPUTED_DEFAULT@")
 set(CMAKE_OBJCXX_EXTENSIONS_COMPUTED_DEFAULT "@CMAKE_OBJCXX_EXTENSIONS_COMPUTED_DEFAULT@")
+set(CMAKE_OBJCXX_STANDARD_LATEST "@CMAKE_OBJCXX_STANDARD_LATEST@")
 set(CMAKE_OBJCXX_COMPILE_FEATURES "@CMAKE_OBJCXX_COMPILE_FEATURES@")
 set(CMAKE_OBJCXX98_COMPILE_FEATURES "@CMAKE_OBJCXX98_COMPILE_FEATURES@")
 set(CMAKE_OBJCXX11_COMPILE_FEATURES "@CMAKE_OBJCXX11_COMPILE_FEATURES@")

+ 2 - 0
Modules/Compiler/ADSP-C.cmake

@@ -8,4 +8,6 @@ set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
 
 set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
 
+set(CMAKE_C_STANDARD_LATEST 99)
+
 __compiler_check_default_language_standard(C 8.0.0.0 99)

+ 2 - 0
Modules/Compiler/ADSP-CXX.cmake

@@ -6,11 +6,13 @@ __compiler_adsp(CXX)
 set(CMAKE_CXX98_STANDARD_COMPILE_OPTION -c++)
 set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION -g++)
 set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
+set(CMAKE_CXX_STANDARD_LATEST 98)
 
 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.3.0.0)
   set(CMAKE_CXX11_STANDARD_COMPILE_OPTION -c++11)
   set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION -c++11 -g++)
   set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_CXX_STANDARD_LATEST 11)
 endif()
 
 __compiler_check_default_language_standard(CXX 8.0.0.0 98)

+ 10 - 0
Modules/Compiler/ARMClang-C.cmake

@@ -21,3 +21,13 @@ set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
 set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
 set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
 set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+
+set(CMAKE_C_STANDARD_LATEST 11)
+
+# Including the "${CMAKE_ROOT}/Modules/Compiler/Clang-C.cmake" script above may set several other compile option
+# variables which do not necessarily apply here. So, we unset those variables accordingly.
+unset(CMAKE_C17_STANDARD_COMPILE_OPTION)
+unset(CMAKE_C17_EXTENSION_COMPILE_OPTION)
+
+unset(CMAKE_C23_STANDARD_COMPILE_OPTION)
+unset(CMAKE_C23_EXTENSION_COMPILE_OPTION)

+ 4 - 0
Modules/Compiler/AppleClang-C.cmake

@@ -26,16 +26,20 @@ if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.0)
   set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
   set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_C_STANDARD_LATEST 11)
 endif()
 
 if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 11.0)
   set(CMAKE_C17_STANDARD_COMPILE_OPTION "-std=c17")
   set(CMAKE_C17_EXTENSION_COMPILE_OPTION "-std=gnu17")
+  set(CMAKE_C_STANDARD_LATEST 17)
 endif()
 
 if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 11.0.3)
   set(CMAKE_C23_STANDARD_COMPILE_OPTION "-std=c2x")
   set(CMAKE_C23_EXTENSION_COMPILE_OPTION "-std=gnu2x")
+  set(CMAKE_C_STANDARD_LATEST 23)
 endif()
 
 __compiler_check_default_language_standard(C 4.0 99 9.1 11 12.0.5 17)

+ 9 - 0
Modules/Compiler/AppleClang-CXX.cmake

@@ -22,25 +22,31 @@ if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.0)
 
   set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
   set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
+
+  set(CMAKE_CXX_STANDARD_LATEST 11)
 endif()
 
 if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.1)
   set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
   set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
   set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_CXX_STANDARD_LATEST 14)
 elseif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1)
   # AppleClang 5.0 knows this flag, but does not set a __cplusplus macro greater than 201103L
   set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++1y")
   set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
   set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_CXX_STANDARD_LATEST 14)
 endif()
 
 if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0)
   set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17")
   set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
+  set(CMAKE_CXX_STANDARD_LATEST 17)
 elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.1)
   set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++1z")
   set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++1z")
+  set(CMAKE_CXX_STANDARD_LATEST 17)
 endif()
 
 if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
@@ -50,14 +56,17 @@ endif()
 if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.0)
   set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++20")
   set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++20")
+  set(CMAKE_CXX_STANDARD_LATEST 20)
 elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0)
   set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++2a")
   set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++2a")
+  set(CMAKE_CXX_STANDARD_LATEST 20)
 endif()
 
 if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.0)
   set(CMAKE_CXX23_STANDARD_COMPILE_OPTION "-std=c++2b")
   set(CMAKE_CXX23_EXTENSION_COMPILE_OPTION "-std=gnu++2b")
+  set(CMAKE_CXX_STANDARD_LATEST 23)
 endif()
 
 __compiler_check_default_language_standard(CXX 4.0 98)

+ 7 - 1
Modules/Compiler/AppleClang-OBJC.cmake

@@ -21,6 +21,8 @@ if(NOT CMAKE_OBJC_COMPILER_VERSION VERSION_LESS 4.0)
   set(CMAKE_OBJC11_STANDARD_COMPILE_OPTION "-std=c11")
   set(CMAKE_OBJC11_EXTENSION_COMPILE_OPTION "-std=gnu11")
   set(CMAKE_OBJC11_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_OBJC_STANDARD_LATEST 11)
 endif()
 
 # AppleClang 10.0 was the oldest compiler available to test C17 support
@@ -28,12 +30,16 @@ if(NOT CMAKE_OBJC_COMPILER_VERSION VERSION_LESS 10.0)
   set(CMAKE_OBJC17_STANDARD_COMPILE_OPTION "-std=c17")
   set(CMAKE_OBJC17_EXTENSION_COMPILE_OPTION "-std=gnu17")
   set(CMAKE_OBJC17_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_OBJC_STANDARD_LATEST 17)
 endif()
 
-if(NOT CMAKE_OBJC_COMPILER_VERSION VERSION_LESS 11.0)
+if(NOT CMAKE_OBJC_COMPILER_VERSION VERSION_LESS 11.0.3)
   set(CMAKE_OBJC23_STANDARD_COMPILE_OPTION "-std=c2x")
   set(CMAKE_OBJC23_EXTENSION_COMPILE_OPTION "-std=gnu2x")
   set(CMAKE_OBJC23_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_OBJC_STANDARD_LATEST 23)
 endif()
 
 # AppleClang 10.0 was the oldest compiler available to test default C11 support

+ 7 - 0
Modules/Compiler/AppleClang-OBJCXX.cmake

@@ -19,25 +19,31 @@ if(NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 4.0)
 
   set(CMAKE_OBJCXX11_STANDARD_COMPILE_OPTION "-std=c++11")
   set(CMAKE_OBJCXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
+
+  set(CMAKE_OBJCXX_STANDARD_LATEST 11)
 endif()
 
 if(NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 6.1)
   set(CMAKE_OBJCXX14_STANDARD_COMPILE_OPTION "-std=c++14")
   set(CMAKE_OBJCXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
   set(CMAKE_OBJCXX14_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_OBJCXX_STANDARD_LATEST 14)
 elseif(NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 5.1)
   # AppleClang 5.0 knows this flag, but does not set a __cplusplus macro greater than 201103L
   set(CMAKE_OBJCXX14_STANDARD_COMPILE_OPTION "-std=c++1y")
   set(CMAKE_OBJCXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
   set(CMAKE_OBJCXX14_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_OBJCXX_STANDARD_LATEST 14)
 endif()
 
 if (NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 10.0)
   set(CMAKE_OBJCXX17_STANDARD_COMPILE_OPTION "-std=c++17")
   set(CMAKE_OBJCXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
+  set(CMAKE_OBJCXX_STANDARD_LATEST 17)
 elseif (NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 6.1)
   set(CMAKE_OBJCXX17_STANDARD_COMPILE_OPTION "-std=c++1z")
   set(CMAKE_OBJCXX17_EXTENSION_COMPILE_OPTION "-std=gnu++1z")
+  set(CMAKE_OBJCXX_STANDARD_LATEST 17)
 endif()
 
 if (NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 8.0)
@@ -47,6 +53,7 @@ endif()
 if (NOT CMAKE_OBJCXX_COMPILER_VERSION VERSION_LESS 10.0)
   set(CMAKE_OBJCXX20_STANDARD_COMPILE_OPTION "-std=c++2a")
   set(CMAKE_OBJCXX20_EXTENSION_COMPILE_OPTION "-std=gnu++2a")
+  set(CMAKE_OBJCXX_STANDARD_LATEST 20)
 endif()
 
 __compiler_check_default_language_standard(OBJCXX 4.0 98)

+ 9 - 0
Modules/Compiler/Clang-C.cmake

@@ -33,27 +33,34 @@ if("x${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU")
 
     set(CMAKE_C99_STANDARD_COMPILE_OPTION "-std=c99")
     set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99")
+
+    set(CMAKE_C_STANDARD_LATEST 99)
   endif()
 
   if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 3.1)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
+    set(CMAKE_C_STANDARD_LATEST 11)
   elseif(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 3.0)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c1x")
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu1x")
+    set(CMAKE_C_STANDARD_LATEST 11)
   endif()
 
   if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 6.0)
     set(CMAKE_C17_STANDARD_COMPILE_OPTION "-std=c17")
     set(CMAKE_C17_EXTENSION_COMPILE_OPTION "-std=gnu17")
+    set(CMAKE_C_STANDARD_LATEST 17)
   endif()
 
   if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 18.0)
     set(CMAKE_C23_STANDARD_COMPILE_OPTION "-std=c23")
     set(CMAKE_C23_EXTENSION_COMPILE_OPTION "-std=gnu23")
+    set(CMAKE_C_STANDARD_LATEST 23)
   elseif(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 9.0)
     set(CMAKE_C23_STANDARD_COMPILE_OPTION "-std=c2x")
     set(CMAKE_C23_EXTENSION_COMPILE_OPTION "-std=gnu2x")
+    set(CMAKE_C_STANDARD_LATEST 23)
   endif()
 else()
   set(CMAKE_C90_STANDARD_COMPILE_OPTION "")
@@ -74,6 +81,8 @@ else()
     set(CMAKE_C17_STANDARD_COMPILE_OPTION "")
     set(CMAKE_C17_EXTENSION_COMPILE_OPTION "")
   endif()
+
+  set(CMAKE_C_STANDARD_LATEST 17)
 endif()
 
 if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 2.1)

+ 6 - 0
Modules/Compiler/Clang-OBJC.cmake

@@ -22,18 +22,24 @@ if(NOT CMAKE_OBJC_COMPILER_VERSION VERSION_LESS 3.4)
   set(CMAKE_OBJC11_STANDARD_COMPILE_OPTION "-std=c11")
   set(CMAKE_OBJC11_EXTENSION_COMPILE_OPTION "-std=gnu11")
   set(CMAKE_OBJC11_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_OBJC_STANDARD_LATEST 11)
 endif()
 
 if(NOT CMAKE_OBJC_COMPILER_VERSION VERSION_LESS 6.0)
   set(CMAKE_OBJC17_STANDARD_COMPILE_OPTION "-std=c17")
   set(CMAKE_OBJC17_EXTENSION_COMPILE_OPTION "-std=gnu17")
   set(CMAKE_OBJC17_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_OBJC_STANDARD_LATEST 17)
 endif()
 
 if(NOT CMAKE_OBJC_COMPILER_VERSION VERSION_LESS 9.0)
   set(CMAKE_OBJC23_STANDARD_COMPILE_OPTION "-std=c2x")
   set(CMAKE_OBJC23_EXTENSION_COMPILE_OPTION "-std=gnu2x")
   set(CMAKE_OBJC23_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_OBJC_STANDARD_LATEST 23)
 endif()
 
 __compiler_check_default_language_standard(OBJC 3.4 99 3.6 11)

+ 23 - 0
Modules/Compiler/Clang.cmake

@@ -135,6 +135,7 @@ macro(__compiler_clang_cxx_standards lang)
     if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 2.1)
       set(CMAKE_${lang}98_STANDARD_COMPILE_OPTION "-std=c++98")
       set(CMAKE_${lang}98_EXTENSION_COMPILE_OPTION "-std=gnu++98")
+      set(CMAKE_${lang}_STANDARD_LATEST 98)
     endif()
 
     if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.1)
@@ -142,19 +143,23 @@ macro(__compiler_clang_cxx_standards lang)
       set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c++11")
       set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
       set(CMAKE_${lang}11_STANDARD__HAS_FULL_SUPPORT ON)
+      set(CMAKE_${lang}_STANDARD_LATEST 11)
     elseif(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 2.1)
       set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c++0x")
       set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu++0x")
+      set(CMAKE_${lang}_STANDARD_LATEST 11)
     endif()
 
     if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.5)
       set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std=c++14")
       set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
       set(CMAKE_${lang}14_STANDARD__HAS_FULL_SUPPORT ON)
+      set(CMAKE_${lang}_STANDARD_LATEST 14)
     elseif(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.4)
       set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std=c++1y")
       set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
       set(CMAKE_${lang}14_STANDARD__HAS_FULL_SUPPORT ON)
+      set(CMAKE_${lang}_STANDARD_LATEST 14)
     endif()
 
     set(_clang_version_std17 5.0)
@@ -165,17 +170,21 @@ macro(__compiler_clang_cxx_standards lang)
     if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS "${_clang_version_std17}")
       set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c++17")
       set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
+      set(CMAKE_${lang}_STANDARD_LATEST 17)
     elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.5)
       set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c++1z")
       set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=gnu++1z")
+      set(CMAKE_${lang}_STANDARD_LATEST 17)
     endif()
 
     if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 11.0)
       set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std=c++20")
       set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std=gnu++20")
+      set(CMAKE_${lang}_STANDARD_LATEST 20)
     elseif(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS "${_clang_version_std17}")
       set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std=c++2a")
       set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std=gnu++2a")
+      set(CMAKE_${lang}_STANDARD_LATEST 20)
     endif()
 
     unset(_clang_version_std17)
@@ -190,9 +199,11 @@ macro(__compiler_clang_cxx_standards lang)
       set(CMAKE_${lang}23_EXTENSION_COMPILE_OPTION "-std=gnu++23")
       set(CMAKE_${lang}26_STANDARD_COMPILE_OPTION "-std=c++26")
       set(CMAKE_${lang}26_EXTENSION_COMPILE_OPTION "-std=gnu++26")
+      set(CMAKE_${lang}_STANDARD_LATEST 26)
     elseif(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 12.0)
       set(CMAKE_${lang}23_STANDARD_COMPILE_OPTION "-std=c++2b")
       set(CMAKE_${lang}23_EXTENSION_COMPILE_OPTION "-std=gnu++2b")
+      set(CMAKE_${lang}_STANDARD_LATEST 23)
     endif()
 
     unset(_clang_version_std23)
@@ -231,14 +242,18 @@ macro(__compiler_clang_cxx_standards lang)
       set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std:c++latest")
     endif()
 
+    set(CMAKE_${lang}_STANDARD_LATEST 17)
+
     if(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0)
       set(CMAKE_${lang}23_STANDARD_COMPILE_OPTION "-std:c++latest")
       set(CMAKE_${lang}23_EXTENSION_COMPILE_OPTION "-std:c++latest")
       set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std:c++20")
       set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std:c++20")
+      set(CMAKE_${lang}_STANDARD_LATEST 23)
     elseif(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 6.0)
       set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std:c++latest")
       set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std:c++latest")
+      set(CMAKE_${lang}_STANDARD_LATEST 20)
     endif()
 
     __compiler_check_default_language_standard(${lang} 3.9 14)
@@ -262,6 +277,14 @@ macro(__compiler_clang_cxx_standards lang)
     # There is no meaningful default for this
     set(CMAKE_${lang}_STANDARD_DEFAULT "")
 
+    if(CMAKE_${lang}_SIMULATE_VERSION VERSION_GREATER_EQUAL 19.0)
+      set(CMAKE_${lang}_STANDARD_LATEST 17)
+    elseif(CMAKE_${lang}_SIMULATE_VERSION VERSION_GREATER_EQUAL 18.0)
+      set(CMAKE_${lang}_STANDARD_LATEST 14)
+    elseif(CMAKE_${lang}_SIMULATE_VERSION VERSION_GREATER_EQUAL 16.0)
+      set(CMAKE_${lang}_STANDARD_LATEST 11)
+    endif()
+
     # There are no compiler modes so we only need to test features once.
     # Override the default macro for this special case.  Pretend that
     # all language standards are available so that at least compilation

+ 2 - 0
Modules/Compiler/Cray-C.cmake

@@ -14,10 +14,12 @@ if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1)
   set(CMAKE_C99_STANDARD_COMPILE_OPTION  -h c99,conform)
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION -h c99,gnu)
   set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_C_STANDARD_LATEST 99)
   if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.5)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION  -h std=c11,conform)
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION -h std=c11,gnu)
     set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_C_STANDARD_LATEST 11)
   endif ()
 endif ()
 

+ 3 - 0
Modules/Compiler/Cray-CXX.cmake

@@ -11,15 +11,18 @@ if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1)
   set(CMAKE_CXX98_STANDARD_COMPILE_OPTION  -h conform)
   set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION -h gnu)
   set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_CXX_STANDARD_LATEST 98)
   if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.4)
     set(CMAKE_CXX11_STANDARD_COMPILE_OPTION  -h std=c++11)
     set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION -h std=c++11,gnu)
     set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_CXX_STANDARD_LATEST 11)
   endif()
   if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.6)
     set(CMAKE_CXX14_STANDARD_COMPILE_OPTION  -h std=c++14)
     set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION -h std=c++14,gnu)
     set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_CXX_STANDARD_LATEST 14)
   endif ()
 endif ()
 

+ 2 - 0
Modules/Compiler/CrayClang-C.cmake

@@ -27,4 +27,6 @@ set(CMAKE_C17_EXTENSION_COMPILE_OPTION -std=gnu17)
 set(CMAKE_C23_STANDARD_COMPILE_OPTION  -std=c2x)
 set(CMAKE_C23_EXTENSION_COMPILE_OPTION -std=gnu2x)
 
+set(CMAKE_C_STANDARD_LATEST 23)
+
 __compiler_check_default_language_standard(C 15.0.0 17)

+ 2 - 0
Modules/Compiler/CrayClang-CXX.cmake

@@ -32,4 +32,6 @@ 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)
 
+set(CMAKE_CXX_STANDARD_LATEST 23)
+
 __compiler_check_default_language_standard(CXX 15.0.0 14)

+ 2 - 0
Modules/Compiler/Fujitsu-C.cmake

@@ -15,6 +15,8 @@ if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4)
   set(CMAKE_C11_STANDARD_COMPILE_OPTION  -std=c11)
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION -std=gnu11)
   set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_C_STANDARD_LATEST 11)
 endif()
 
 __compiler_check_default_language_standard(C 4 11)

+ 2 - 0
Modules/Compiler/Fujitsu-CXX.cmake

@@ -42,6 +42,8 @@ if(CMAKE_CXX_COMPILER_VERSION GREATER_EQUAL 4)
 
   set(CMAKE_CXX17_STANDARD_COMPILE_OPTION  -std=c++17)
   set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION -std=gnu++17)
+
+  set(CMAKE_CXX_STANDARD_LATEST 17)
 endif()
 
 __compiler_check_default_language_standard(CXX 4 14)

+ 1 - 0
Modules/Compiler/GNU-OBJC.cmake

@@ -1,5 +1,6 @@
 include(Compiler/GNU)
 __compiler_gnu(OBJC)
+__compiler_gnu_c_standards(OBJC)
 
 
 if((NOT DEFINED CMAKE_DEPENDS_USE_COMPILER OR CMAKE_DEPENDS_USE_COMPILER)

+ 1 - 0
Modules/Compiler/GNU-OBJCXX.cmake

@@ -1,5 +1,6 @@
 include(Compiler/GNU)
 __compiler_gnu(OBJCXX)
+__compiler_gnu_cxx_standards(OBJCXX)
 
 if((NOT DEFINED CMAKE_DEPENDS_USE_COMPILER OR CMAKE_DEPENDS_USE_COMPILER)
     AND CMAKE_GENERATOR MATCHES "Makefiles|WMake"

+ 17 - 0
Modules/Compiler/GNU.cmake

@@ -212,9 +212,11 @@ macro(__compiler_gnu_c_standards lang)
   if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.5)
     set(CMAKE_${lang}90_STANDARD_COMPILE_OPTION "-std=c90")
     set(CMAKE_${lang}90_EXTENSION_COMPILE_OPTION "-std=gnu90")
+    set(CMAKE_${lang}_STANDARD_LATEST 90)
   elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.4)
     set(CMAKE_${lang}90_STANDARD_COMPILE_OPTION "-std=c89")
     set(CMAKE_${lang}90_EXTENSION_COMPILE_OPTION "-std=gnu89")
+    set(CMAKE_${lang}_STANDARD_LATEST 90)
   endif()
 
   if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.4)
@@ -222,25 +224,30 @@ macro(__compiler_gnu_c_standards lang)
     set(CMAKE_${lang}99_STANDARD_COMPILE_OPTION "-std=c99")
     set(CMAKE_${lang}99_EXTENSION_COMPILE_OPTION "-std=gnu99")
     set(CMAKE_${lang}99_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_${lang}_STANDARD_LATEST 99)
   endif()
 
   if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.7)
     set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c11")
     set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu11")
     set(CMAKE_${lang}11_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_${lang}_STANDARD_LATEST 11)
   elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.6)
     set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c1x")
     set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu1x")
+    set(CMAKE_${lang}_STANDARD_LATEST 11)
   endif()
 
   if(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 8.1)
     set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c17")
     set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=gnu17")
+    set(CMAKE_${lang}_STANDARD_LATEST 17)
   endif()
 
   if(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 9.1)
     set(CMAKE_${lang}23_STANDARD_COMPILE_OPTION "-std=c2x")
     set(CMAKE_${lang}23_EXTENSION_COMPILE_OPTION "-std=gnu2x")
+    set(CMAKE_${lang}_STANDARD_LATEST 23)
   endif()
 endmacro()
 
@@ -248,16 +255,19 @@ macro(__compiler_gnu_cxx_standards lang)
   if(NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 3.4)
     set(CMAKE_${lang}98_STANDARD_COMPILE_OPTION "-std=c++98")
     set(CMAKE_${lang}98_EXTENSION_COMPILE_OPTION "-std=gnu++98")
+    set(CMAKE_${lang}_STANDARD_LATEST 98)
   endif()
 
   if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.7)
     set(CMAKE_${lang}98_STANDARD__HAS_FULL_SUPPORT ON)
     set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c++11")
     set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
+    set(CMAKE_${lang}_STANDARD_LATEST 11)
   elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.4)
     # 4.3 supports 0x variants
     set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c++0x")
     set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=gnu++0x")
+    set(CMAKE_${lang}_STANDARD_LATEST 11)
   endif()
 
   if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.8.1)
@@ -267,9 +277,11 @@ macro(__compiler_gnu_cxx_standards lang)
   if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.9)
     set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std=c++14")
     set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
+    set(CMAKE_${lang}_STANDARD_LATEST 14)
   elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 4.8)
     set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std=c++1y")
     set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
+    set(CMAKE_${lang}_STANDARD_LATEST 14)
   endif()
 
   if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 5.0)
@@ -279,9 +291,11 @@ macro(__compiler_gnu_cxx_standards lang)
   if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 8.0)
     set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c++17")
     set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
+    set(CMAKE_${lang}_STANDARD_LATEST 17)
   elseif (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 5.1)
     set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c++1z")
     set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=gnu++1z")
+    set(CMAKE_${lang}_STANDARD_LATEST 17)
   endif()
 
   if(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 11.1)
@@ -289,13 +303,16 @@ macro(__compiler_gnu_cxx_standards lang)
     set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std=gnu++20")
     set(CMAKE_${lang}23_STANDARD_COMPILE_OPTION "-std=c++23")
     set(CMAKE_${lang}23_EXTENSION_COMPILE_OPTION "-std=gnu++23")
+    set(CMAKE_${lang}_STANDARD_LATEST 23)
   elseif(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 8.0)
     set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std=c++2a")
     set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std=gnu++2a")
+    set(CMAKE_${lang}_STANDARD_LATEST 20)
   endif()
 
   if(CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 14.0)
     set(CMAKE_${lang}26_STANDARD_COMPILE_OPTION "-std=c++26")
     set(CMAKE_${lang}26_EXTENSION_COMPILE_OPTION "-std=gnu++26")
+    set(CMAKE_${lang}_STANDARD_LATEST 26)
   endif()
 endmacro()

+ 3 - 0
Modules/Compiler/IBMClang-C.cmake

@@ -23,8 +23,11 @@ set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
 set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
 set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
 
+set(CMAKE_C_STANDARD_LATEST 11)
+
 if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 17.1.0)
   set(CMAKE_C17_STANDARD_COMPILE_OPTION  "-std=c17")
   set(CMAKE_C17_EXTENSION_COMPILE_OPTION "-std=gnu17")
+  set(CMAKE_C_STANDARD_LATEST 17)
 endif ()
 __compiler_check_default_language_standard(C 17.1.0 17)

+ 3 - 0
Modules/Compiler/IBMClang-CXX.cmake

@@ -26,6 +26,8 @@ set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
 set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
 set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
 
+set(CMAKE_CXX_STANDARD_LATEST 14)
+
 if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 17.1.0)
   set(CMAKE_CXX17_STANDARD_COMPILE_OPTION  "-std=c++17")
   set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
@@ -33,6 +35,7 @@ if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 17.1.0)
   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")
+  set(CMAKE_CXX_STANDARD_LATEST 23)
 endif()
 
 __compiler_check_default_language_standard(CXX 17.1.0 17)

+ 16 - 12
Modules/Compiler/Intel-C.cmake

@@ -19,12 +19,6 @@ if("x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC")
   set(CMAKE_C_CLANG_TIDY_DRIVER_MODE "cl")
   set(CMAKE_C_INCLUDE_WHAT_YOU_USE_DRIVER_MODE "cl")
 
-  if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 16.0.0)
-    set(CMAKE_C11_STANDARD_COMPILE_OPTION "-Qstd=c11")
-    set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-Qstd=c11")
-    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
-  endif()
-
   if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 12.0)
     set(CMAKE_C90_STANDARD_COMPILE_OPTION "-Qstd=c89")
     set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-Qstd=c89")
@@ -32,18 +26,20 @@ if("x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC")
     set(CMAKE_C99_STANDARD_COMPILE_OPTION "-Qstd=c99")
     set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-Qstd=c99")
     set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_C_STANDARD_LATEST 99)
+  endif()
+
+  if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 16.0.0)
+    set(CMAKE_C11_STANDARD_COMPILE_OPTION "-Qstd=c11")
+    set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-Qstd=c11")
+    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_C_STANDARD_LATEST 11)
   endif()
 
 else()
 
   set(CMAKE_C_COMPILE_OPTIONS_EXPLICIT_LANGUAGE -x c)
 
-  if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 15.0.0)
-    set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
-    set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
-    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
-  endif()
-
   if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 12.0)
     set(CMAKE_C90_STANDARD_COMPILE_OPTION "-std=c89")
     set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu89")
@@ -51,6 +47,14 @@ else()
     set(CMAKE_C99_STANDARD_COMPILE_OPTION "-std=c99")
     set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99")
     set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_C_STANDARD_LATEST 99)
+  endif()
+
+  if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 15.0.0)
+    set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
+    set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
+    set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_C_STANDARD_LATEST 11)
   endif()
 
 endif()

+ 49 - 38
Modules/Compiler/Intel-CXX.cmake

@@ -18,57 +18,70 @@ if("x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC")
   set(CMAKE_CXX_CLANG_TIDY_DRIVER_MODE "cl")
   set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE_DRIVER_MODE "cl")
 
-  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0.0)
-    set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-Qstd=c++20")
-    set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-Qstd=c++20")
-  endif()
+  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.1)
+    set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "")
+    set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "")
+    set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
 
-  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 18.0.0)
-    set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-Qstd=c++17")
-    set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-Qstd=c++17")
+    if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.0)
+      set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-Qstd=c++11")
+      set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-Qstd=c++11")
+    else()
+      set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-Qstd=c++0x")
+      set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-Qstd=c++0x")
+    endif()
+
+    set(CMAKE_CXX_STANDARD_LATEST 11)
   endif()
 
   if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16.0)
     set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-Qstd=c++14")
     set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-Qstd=c++14")
+    set(CMAKE_CXX_STANDARD_LATEST 14)
   endif()
 
-  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.0)
-    set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-Qstd=c++11")
-    set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-Qstd=c++11")
-  elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.1)
-    set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-Qstd=c++0x")
-    set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-Qstd=c++0x")
+  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 18.0.0)
+    set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-Qstd=c++17")
+    set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-Qstd=c++17")
+    set(CMAKE_CXX_STANDARD_LATEST 17)
   endif()
 
-  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.1)
-    set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "")
-    set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "")
-    set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
+  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.0.0)
+    set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-Qstd=c++20")
+    set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-Qstd=c++20")
+    set(CMAKE_CXX_STANDARD_LATEST 20)
   endif()
 
 else()
 
   set(CMAKE_CXX_COMPILE_OPTIONS_EXPLICIT_LANGUAGE -x c++)
 
-  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()
+  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.1)
+    set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-std=c++98")
+    set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-std=gnu++98")
+    set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
 
-  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 18.0.0)
-    set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17")
-    set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
+    if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.0)
+      set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
+      set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
+    else()
+      set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++0x")
+      set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++0x")
+    endif()
+
+    set(CMAKE_CXX_STANDARD_LATEST 11)
   endif()
 
-  if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 17.0)
-    set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
+  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0)
+    set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
   endif()
 
   if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.2)
     set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
+    set(CMAKE_CXX_STANDARD_LATEST 14)
   elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.0)
     set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++1y")
+    set(CMAKE_CXX_STANDARD_LATEST 14)
   endif()
 
   # Intel 15.0.2 accepts c++14 instead of c++1y, but not gnu++14
@@ -79,22 +92,20 @@ else()
     set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
   endif()
 
-  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0)
-    set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
+  if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 17.0)
+    set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
   endif()
 
-  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.0)
-    set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
-    set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
-  elseif (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.1)
-    set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++0x")
-    set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++0x")
+  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 18.0.0)
+    set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17")
+    set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
+    set(CMAKE_CXX_STANDARD_LATEST 17)
   endif()
 
-  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.1)
-    set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-std=c++98")
-    set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-std=gnu++98")
-    set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
+  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")
+    set(CMAKE_CXX_STANDARD_LATEST 20)
   endif()
 
 endif()

+ 6 - 0
Modules/Compiler/IntelLLVM-C.cmake

@@ -42,9 +42,12 @@ 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_C_STANDARD_LATEST 17)
+
   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")
+    set(CMAKE_C_STANDARD_LATEST 23)
   endif()
 else()
   set(CMAKE_C90_STANDARD_COMPILE_OPTION "-Qstd:c90")
@@ -59,9 +62,12 @@ else()
   set(CMAKE_C17_STANDARD_COMPILE_OPTION "-Qstd:c17")
   set(CMAKE_C17_EXTENSION_COMPILE_OPTION "-Qstd:c17")
 
+  set(CMAKE_C_STANDARD_LATEST 17)
+
   if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 2022.1.0)
     set(CMAKE_C23_STANDARD_COMPILE_OPTION "-Qstd:c2x")
     set(CMAKE_C23_EXTENSION_COMPILE_OPTION "-Qstd:c2x")
+    set(CMAKE_C_STANDARD_LATEST 23)
   endif()
 endif()
 

+ 6 - 0
Modules/Compiler/IntelLLVM-CXX.cmake

@@ -47,9 +47,12 @@ 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_CXX_STANDARD_LATEST 20)
+
   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")
+    set(CMAKE_CXX_STANDARD_LATEST 23)
   endif()
 else()
   set(CMAKE_CXX98_STANDARD_COMPILE_OPTION  "")
@@ -67,9 +70,12 @@ else()
   set(CMAKE_CXX20_STANDARD_COMPILE_OPTION  "-Qstd:c++20")
   set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-Qstd:c++20")
 
+  set(CMAKE_CXX_STANDARD_LATEST 20)
+
   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")
+    set(CMAKE_CXX_STANDARD_LATEST 23)
   endif()
 endif()
 

+ 4 - 0
Modules/Compiler/LCC-C.cmake

@@ -22,15 +22,19 @@ set(CMAKE_C99_STANDARD_COMPILE_OPTION "-std=c99")
 set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99")
 set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
 
+set(CMAKE_C_STANDARD_LATEST 99)
+
 if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 1.20)
   set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
   set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_C_STANDARD_LATEST 11)
 endif()
 
 if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 1.26)
   set(CMAKE_C17_STANDARD_COMPILE_OPTION "-std=c17")
   set(CMAKE_C17_EXTENSION_COMPILE_OPTION "-std=gnu17")
+  set(CMAKE_C_STANDARD_LATEST 17)
 endif()
 
 __compiler_check_default_language_standard(C 1.17 89 1.23 99 1.26 17)

+ 6 - 0
Modules/Compiler/LCC-CXX.cmake

@@ -18,26 +18,32 @@ set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-std=c++98")
 set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-std=gnu++98")
 set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
 
+set(CMAKE_CXX_STANDARD_LATEST 98)
+
 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 1.20)
   set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
   set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
   set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_CXX_STANDARD_LATEST 11)
 endif()
 
 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 1.21)
   set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
   set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++14")
   set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_CXX_STANDARD_LATEST 14)
 endif()
 
 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 1.24)
   set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17")
   set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
+  set(CMAKE_CXX_STANDARD_LATEST 17)
 endif()
 
 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 1.26)
   set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std=c++2a")
   set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std=gnu++2a")
+  set(CMAKE_CXX_STANDARD_LATEST 20)
 endif()
 
 __compiler_check_default_language_standard(CXX 1.19 98 1.20 11 1.21 14 1.24 17 1.26 20)

+ 4 - 0
Modules/Compiler/MSVC-C.cmake

@@ -14,12 +14,15 @@ if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27)
   set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std:c11")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std:c11")
 
+  set(CMAKE_C_STANDARD_LATEST 11)
+
   if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 19.28)
     set(CMAKE_C90_STANDARD__HAS_FULL_SUPPORT ON)
     set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
     set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
     set(CMAKE_C17_STANDARD_COMPILE_OPTION "-std:c17")
     set(CMAKE_C17_EXTENSION_COMPILE_OPTION "-std:c17")
+    set(CMAKE_C_STANDARD_LATEST 17)
   else()
     # Special case for 19.27 (VS 16.7): C11 has partial support.
     macro(cmake_record_c_compile_features)
@@ -41,6 +44,7 @@ else()
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION "")
   set(CMAKE_C11_STANDARD_COMPILE_OPTION "")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "")
+  set(CMAKE_C_STANDARD_LATEST 11)
 
   # There is no meaningful default for this
   set(CMAKE_C_STANDARD_DEFAULT "")

+ 12 - 0
Modules/Compiler/MSVC-CXX.cmake

@@ -30,14 +30,18 @@ if ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.0.24215.1 AND
     set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std:c++latest")
   endif()
 
+  set(CMAKE_CXX_STANDARD_LATEST 17)
+
   if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.29.30129)
     set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++20")
     set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std:c++20")
     set(CMAKE_CXX23_STANDARD_COMPILE_OPTION "-std:c++latest")
     set(CMAKE_CXX23_EXTENSION_COMPILE_OPTION "-std:c++latest")
+    set(CMAKE_CXX_STANDARD_LATEST 23)
   elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.12.25835)
     set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++latest")
     set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std:c++latest")
+    set(CMAKE_CXX_STANDARD_LATEST 20)
   endif()
 
   __compiler_check_default_language_standard(CXX 19.0 14)
@@ -57,6 +61,14 @@ elseif (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0)
   set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "")
   set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "")
 
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.0)
+    set(CMAKE_CXX_STANDARD_LATEST 17)
+  elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 18.0)
+    set(CMAKE_CXX_STANDARD_LATEST 14)
+  else()
+    set(CMAKE_CXX_STANDARD_LATEST 11)
+  endif()
+
   # There is no meaningful default for this
   set(CMAKE_CXX_STANDARD_DEFAULT "")
 

+ 1 - 0
Modules/Compiler/NVHPC-C.cmake

@@ -7,6 +7,7 @@ set(CMAKE_C_COMPILE_OPTIONS_EXPLICIT_LANGUAGE -x c)
 if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 20.11)
   set(CMAKE_C17_STANDARD_COMPILE_OPTION  -std=c17)
   set(CMAKE_C17_EXTENSION_COMPILE_OPTION -std=gnu17)
+  set(CMAKE_C_STANDARD_LATEST 17)
 endif()
 
 if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 21.07)

+ 1 - 0
Modules/Compiler/NVHPC-CXX.cmake

@@ -7,6 +7,7 @@ set(CMAKE_CXX_COMPILE_OPTIONS_EXPLICIT_LANGUAGE -x c++)
 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 20.11)
   set(CMAKE_CXX20_STANDARD_COMPILE_OPTION  -std=c++20)
   set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION -std=gnu++20)
+  set(CMAKE_CXX_STANDARD_LATEST 20)
 endif()
 
 if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 21.07)

+ 12 - 0
Modules/Compiler/NVIDIA.cmake

@@ -17,6 +17,8 @@ macro(__compiler_nvidia_cxx_standards lang)
     set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "")
     set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "")
 
+    set(CMAKE_${lang}_STANDARD_LATEST 11)
+
     if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 9.0)
       if(CMAKE_${lang}_SIMULATE_VERSION VERSION_GREATER_EQUAL 19.10.25017)
         set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std=c++14")
@@ -25,12 +27,15 @@ macro(__compiler_nvidia_cxx_standards lang)
         set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "")
         set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "")
       endif()
+
+      set(CMAKE_${lang}_STANDARD_LATEST 14)
     endif()
 
     if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 11.0)
       if(CMAKE_${lang}_SIMULATE_VERSION VERSION_GREATER_EQUAL 19.11.25505)
         set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c++17")
         set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=c++17")
+        set(CMAKE_${lang}_STANDARD_LATEST 17)
       endif()
     endif()
 
@@ -38,6 +43,7 @@ macro(__compiler_nvidia_cxx_standards lang)
       if(CMAKE_${lang}_SIMULATE_VERSION VERSION_GREATER_EQUAL 19.11.25505)
         set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std=c++20")
         set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std=c++20")
+        set(CMAKE_${lang}_STANDARD_LATEST 20)
       endif()
     endif()
   else()
@@ -47,21 +53,27 @@ macro(__compiler_nvidia_cxx_standards lang)
     set(CMAKE_${lang}11_STANDARD_COMPILE_OPTION "-std=c++11")
     set(CMAKE_${lang}11_EXTENSION_COMPILE_OPTION "-std=c++11")
 
+    set(CMAKE_${lang}_STANDARD_LATEST 11)
+
     if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 9.0)
       set(CMAKE_${lang}03_STANDARD_COMPILE_OPTION "-std=c++03")
       set(CMAKE_${lang}03_EXTENSION_COMPILE_OPTION "-std=c++03")
       set(CMAKE_${lang}14_STANDARD_COMPILE_OPTION "-std=c++14")
       set(CMAKE_${lang}14_EXTENSION_COMPILE_OPTION "-std=c++14")
+
+      set(CMAKE_${lang}_STANDARD_LATEST 14)
     endif()
 
     if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 11.0)
       set(CMAKE_${lang}17_STANDARD_COMPILE_OPTION "-std=c++17")
       set(CMAKE_${lang}17_EXTENSION_COMPILE_OPTION "-std=c++17")
+      set(CMAKE_${lang}_STANDARD_LATEST 17)
     endif()
 
     if (NOT CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 12.0)
       set(CMAKE_${lang}20_STANDARD_COMPILE_OPTION "-std=c++20")
       set(CMAKE_${lang}20_EXTENSION_COMPILE_OPTION "-std=c++20")
+      set(CMAKE_${lang}_STANDARD_LATEST 20)
     endif()
   endif()
 

+ 2 - 0
Modules/Compiler/OrangeC-C.cmake

@@ -15,6 +15,8 @@ set(CMAKE_C11_STANDARD_COMPILE_OPTION -std=c11)
 set(CMAKE_C11_EXTENSION_COMPILE_OPTION -std=c11)
 set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
 
+set(CMAKE_C_STANDARD_LATEST 11)
+
 __compiler_orangec(C)
 #- 6.38 is the earliest version which version info is available in the preprocessor
 __compiler_check_default_language_standard(C 6.38 11)

+ 2 - 0
Modules/Compiler/OrangeC-CXX.cmake

@@ -20,6 +20,8 @@ set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
 set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=c++14")
 set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
 
+set(CMAKE_CXX_STANDARD_LATEST 14)
+
 __compiler_orangec(CXX)
 #- 6.38 is the earliest version which version info is available in the preprocessor
 __compiler_check_default_language_standard(CXX 6.38 14)

+ 3 - 0
Modules/Compiler/PGI-C.cmake

@@ -10,10 +10,13 @@ if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.10)
   set(CMAKE_C99_STANDARD_COMPILE_OPTION -c99)
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION -c99)
   set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_C_STANDARD_LATEST 99)
   if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 15.3)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION -c11)
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION -c11)
     set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_C_STANDARD_LATEST 11)
   endif ()
 endif ()
 

+ 4 - 0
Modules/Compiler/PGI-CXX.cmake

@@ -7,19 +7,23 @@ if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 12.10)
   set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "")
   set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION --gnu_extensions)
   set(CMAKE_CXX98_STANDARD__HAS_FULL_SUPPORT ON)
+  set(CMAKE_CXX_STANDARD_LATEST 98)
   if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.10)
     set(CMAKE_CXX98_STANDARD_COMPILE_OPTION --c++03)
     set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION --c++03 --gnu_extensions)
     set(CMAKE_CXX11_STANDARD_COMPILE_OPTION  --c++11)
     set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION --c++11 --gnu_extensions)
     set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_CXX_STANDARD_LATEST 11)
     if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 15.7)
       set(CMAKE_CXX14_STANDARD_COMPILE_OPTION  --c++14)
       set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION --c++14 --gnu_extensions)
       set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
+      set(CMAKE_CXX_STANDARD_LATEST 14)
       if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 17.1)
         set(CMAKE_CXX17_STANDARD_COMPILE_OPTION  --c++17)
         set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION --c++17 --gnu_extensions)
+        set(CMAKE_CXX_STANDARD_LATEST 17)
       endif()
     endif()
   endif()

+ 4 - 0
Modules/Compiler/SunPro-C.cmake

@@ -52,11 +52,15 @@ if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 5.13)
   set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=c11")
   set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_C_STANDARD_LATEST 11)
 elseif (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 5.11)
   set(CMAKE_C90_STANDARD_COMPILE_OPTION "")
   set(CMAKE_C90_EXTENSION_COMPILE_OPTION "")
   set(CMAKE_C99_STANDARD_COMPILE_OPTION "-xc99")
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-xc99")
+
+  set(CMAKE_C_STANDARD_LATEST 99)
 endif()
 
 __compiler_check_default_language_standard(C 5.11 90 5.14 11)

+ 4 - 0
Modules/Compiler/SunPro-CXX.cmake

@@ -54,14 +54,18 @@ if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13)
   set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=c++11")
   set(CMAKE_CXX_LINK_WITH_STANDARD_COMPILE_OPTION 1)
 
+  set(CMAKE_CXX_STANDARD_LATEST 11)
+
   if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.14)
     set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++14")
     set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=c++14")
+    set(CMAKE_CXX_STANDARD_LATEST 14)
   endif()
 else()
   set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-library=stlport4")
   set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-library=stlport4")
   set(CMAKE_CXX_LINK_WITH_STANDARD_COMPILE_OPTION 1)
+  set(CMAKE_CXX_STANDARD_LATEST 98)
 endif()
 
 __compiler_check_default_language_standard(CXX 1 98)

+ 5 - 0
Modules/Compiler/TI-C.cmake

@@ -34,18 +34,23 @@ if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "${__COMPILER_TI_C99_VERSION_$
   set(CMAKE_C99_STANDARD_COMPILE_OPTION "--c99" "--strict_ansi")
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION "--c99" "--relaxed_ansi")
 
+  set(CMAKE_C_STANDARD_LATEST 99)
+
   if(DEFINED __COMPILER_TI_C11_VERSION_${CMAKE_C_COMPILER_ARCHITECTURE_ID} AND
      CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "${__COMPILER_TI_C11_VERSION_${CMAKE_C_COMPILER_ARCHITECTURE_ID}}")
 
     set(CMAKE_C11_STANDARD_COMPILE_OPTION "--c11" "--strict_ansi")
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION "--c11" "--relaxed_ansi")
 
+    set(CMAKE_C_STANDARD_LATEST 11)
+
   endif()
 
 else()
 
   set(CMAKE_C90_STANDARD_COMPILE_OPTION "--strict_ansi")
   set(CMAKE_C90_EXTENSION_COMPILE_OPTION "--relaxed_ansi")
+  set(CMAKE_C_STANDARD_LATEST 90)
 
 endif()
 

+ 3 - 0
Modules/Compiler/TI-CXX.cmake

@@ -39,16 +39,19 @@ if(DEFINED __COMPILER_TI_CXX14_VERSION AND
   set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "--c++14" "--strict_ansi")
   set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "--c++14" "--relaxed_ansi")
 
+  set(CMAKE_CXX_STANDARD_LATEST 14)
 
 elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "${__COMPILER_TI_CXX03_VERSION}")
 
   set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "--c++03" "--strict_ansi")
   set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "--c++03" "--relaxed_ansi")
+  set(CMAKE_CXX_STANDARD_LATEST 98)
 
 else()
 
   set(CMAKE_CXX98_STANDARD_COMPILE_OPTION  "--strict_ansi")
   set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "--relaxed_ansi")
+  set(CMAKE_CXX_STANDARD_LATEST 98)
 
 endif()
 

+ 10 - 0
Modules/Compiler/TIClang-C.cmake

@@ -21,3 +21,13 @@ set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
 set(CMAKE_C11_STANDARD_COMPILE_OPTION "-std=c11")
 set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
 set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+
+set(CMAKE_C_STANDARD_LATEST 11)
+
+# Including the "${CMAKE_ROOT}/Modules/Compiler/Clang-C.cmake" script above may set several other compile option
+# variables which do not necessarily apply here. So, we unset those variables accordingly.
+unset(CMAKE_C17_STANDARD_COMPILE_OPTION)
+unset(CMAKE_C17_EXTENSION_COMPILE_OPTION)
+
+unset(CMAKE_C23_STANDARD_COMPILE_OPTION)
+unset(CMAKE_C23_EXTENSION_COMPILE_OPTION)

+ 13 - 0
Modules/Compiler/TIClang-CXX.cmake

@@ -23,3 +23,16 @@ set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
 
 set(CMAKE_CXX17_STANDARD_COMPILE_OPTION "-std=c++17")
 set(CMAKE_CXX17_EXTENSION_COMPILE_OPTION "-std=gnu++17")
+
+set(CMAKE_CXX_STANDARD_LATEST 17)
+
+# Including the "${CMAKE_ROOT}/Modules/Compiler/Clang-CXX.cmake" script above may set several other compile option
+# variables which do not necessarily apply here. So, we unset those variables accordingly.
+unset(CMAKE_CXX20_STANDARD_COMPILE_OPTION)
+unset(CMAKE_CXX20_EXTENSION_COMPILE_OPTION)
+
+unset(CMAKE_CXX23_STANDARD_COMPILE_OPTION)
+unset(CMAKE_CXX23_EXTENSION_COMPILE_OPTION)
+
+unset(CMAKE_CXX26_STANDARD_COMPILE_OPTION)
+unset(CMAKE_CXX26_EXTENSION_COMPILE_OPTION)

+ 2 - 0
Modules/Compiler/Tasking-C.cmake

@@ -10,6 +10,8 @@ set(CMAKE_C99_EXTENSION_COMPILE_OPTION "--iso=99" " ")
 set(CMAKE_C11_STANDARD_COMPILE_OPTION "--iso=11" "--strict")
 set(CMAKE_C11_EXTENSION_COMPILE_OPTION "--iso=11" " ")
 
+set(CMAKE_C_STANDARD_LATEST 11)
+
 if(CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "TriCore")
   if(CMAKE_TASKING_TOOLSET STREQUAL "SmartCode")
     __compiler_check_default_language_standard(C 10.1 11)

+ 2 - 0
Modules/Compiler/Tasking-CXX.cmake

@@ -12,6 +12,8 @@ set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "--c++=11" " ")
 set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "--c++=14" "--strict")
 set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "--c++=14" " ")
 
+set(CMAKE_CXX_STANDARD_LATEST 14)
+
 if(CMAKE_CXX_COMPILER_ARCHITECTURE_ID STREQUAL "TriCore")
   if(CMAKE_TASKING_TOOLSET STREQUAL "SmartCode")
     __compiler_check_default_language_standard(CXX 10.1 14)

+ 3 - 0
Modules/Compiler/XL-C.cmake

@@ -13,10 +13,13 @@ if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 10.1)
   set(CMAKE_C99_STANDARD_COMPILE_OPTION "-qlanglvl=stdc99")
   set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-qlanglvl=extc99")
   set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_C_STANDARD_LATEST 99)
   if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.1)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION "-qlanglvl=extc1x")
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-qlanglvl=extc1x")
     set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_C_STANDARD_LATEST 11)
   endif ()
 endif()
 

+ 3 - 0
Modules/Compiler/XL-CXX.cmake

@@ -24,10 +24,13 @@ if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 10.1)
   # compiler mode for the corresponding standard.
   set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
 
+  set(CMAKE_CXX_STANDARD_LATEST 11)
+
   if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.1.0 AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
     set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-qlanglvl=extended1y")
     set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-qlanglvl=extended1y")
     set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
+    set(CMAKE_CXX_STANDARD_LATEST 14)
   endif()
 endif ()
 

+ 3 - 0
Modules/Compiler/XLClang-C.cmake

@@ -12,11 +12,14 @@ if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.1)
   set(CMAKE_C99_STANDARD__HAS_FULL_SUPPORT ON)
   set(CMAKE_C11_STANDARD_COMPILE_OPTION  "-qlanglvl=extc1x")
   set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-qlanglvl=extc1x")
+
   if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.2)
     set(CMAKE_C11_STANDARD_COMPILE_OPTION  "-std=c11")
     set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
     set(CMAKE_C11_STANDARD__HAS_FULL_SUPPORT ON)
   endif ()
+
+  set(CMAKE_C_STANDARD_LATEST 11)
 endif()
 
 __compiler_check_default_language_standard(C 13.1.1 99)

+ 5 - 0
Modules/Compiler/XLClang-CXX.cmake

@@ -10,12 +10,17 @@ if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.1)
   set(CMAKE_CXX11_STANDARD_COMPILE_OPTION  "-qlanglvl=extended0x")
   set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-qlanglvl=extended0x")
   set(CMAKE_CXX11_STANDARD__HAS_FULL_SUPPORT ON)
+
+  set(CMAKE_CXX_STANDARD_LATEST 11)
+
   if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.2)
     set(CMAKE_CXX11_STANDARD_COMPILE_OPTION  "-std=c++11")
     set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
     set(CMAKE_CXX14_STANDARD_COMPILE_OPTION  "-std=c++1y")
     set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
     set(CMAKE_CXX14_STANDARD__HAS_FULL_SUPPORT ON)
+
+    set(CMAKE_CXX_STANDARD_LATEST 14)
   endif ()
   if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 16.1.0)
     set(CMAKE_CXX14_STANDARD_COMPILE_OPTION  "-std=c++14")

+ 10 - 0
Tests/RunCMake/CMakeLists.txt

@@ -440,6 +440,16 @@ add_RunCMake_test(GoogleTest # Note: does not actually depend on Google Test
   )
 add_RunCMake_test(Graphviz)
 add_RunCMake_test(Languages)
+
+add_RunCMake_test(LanguageStandards
+  -DCMake_NO_C_STANDARD=${CMake_NO_C_STANDARD}
+  -DCMake_NO_CXX_STANDARD=${CMake_NO_CXX_STANDARD}
+  -DCMake_TEST_CUDA=${CMake_TEST_CUDA}
+  -DCMake_TEST_HIP=${CMake_TEST_HIP}
+  -DCMake_TEST_OBJC=${CMake_TEST_OBJC}
+)
+set_property(TEST RunCMake.LanguageStandards APPEND PROPERTY LABELS "CUDA" "HIP")
+
 add_RunCMake_test(LinkItemValidation)
 add_RunCMake_test(LinkStatic)
 if(CMAKE_CXX_COMPILER_ID MATCHES "^(Cray|PGI|NVHPC|XL|XLClang|IBMClang|Fujitsu|FujitsuClang)$")

+ 3 - 0
Tests/RunCMake/LanguageStandards/CMakeLists.txt

@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 3.29)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)

+ 14 - 0
Tests/RunCMake/LanguageStandards/Inspect.cmake

@@ -0,0 +1,14 @@
+enable_language(C)
+enable_language(CXX)
+
+set(info "")
+foreach(var
+    CMAKE_C_STANDARD_DEFAULT
+    CMAKE_CXX_STANDARD_DEFAULT
+    )
+  if(DEFINED ${var})
+    string(APPEND info "set(${var} \"${${var}}\")\n")
+  endif()
+endforeach()
+
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/info.cmake" "${info}")

+ 32 - 0
Tests/RunCMake/LanguageStandards/RunCMakeTest.cmake

@@ -0,0 +1,32 @@
+include(RunCMake)
+
+# Detect information from the toolchain:
+# - CMAKE_C_STANDARD_DEFAULT
+# - CMAKE_CXX_STANDARD_DEFAULT
+run_cmake(Inspect)
+include("${RunCMake_BINARY_DIR}/Inspect-build/info.cmake")
+
+function(run_StdLatest lang)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/StdLatest-${lang}-build)
+  run_cmake(StdLatest-${lang})
+  set(RunCMake_TEST_NO_CLEAN 1)
+  set(RunCMake_TEST_OUTPUT_MERGE 1)
+  run_cmake_command(StdLatest-${lang}-build ${CMAKE_COMMAND} --build . --config Debug)
+endfunction()
+
+if(NOT CMake_NO_C_STANDARD AND DEFINED CMAKE_C_STANDARD_DEFAULT)
+  run_StdLatest(C)
+endif()
+if(NOT CMake_NO_CXX_STANDARD AND DEFINED CMAKE_CXX_STANDARD_DEFAULT)
+  run_StdLatest(CXX)
+endif()
+if(CMake_TEST_CUDA)
+  run_StdLatest(CUDA)
+endif()
+if(CMake_TEST_HIP)
+  run_StdLatest(HIP)
+endif()
+if(CMake_TEST_OBJC)
+  run_StdLatest(OBJC)
+  run_StdLatest(OBJCXX)
+endif()

+ 1 - 0
Tests/RunCMake/LanguageStandards/StdLatest-C-stdout.txt

@@ -0,0 +1 @@
+-- CMAKE_C_STANDARD_LATEST='[0-9][0-9]'

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-C.c

@@ -0,0 +1,4 @@
+int main(void)
+{
+  return 0;
+}

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-C.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+message(STATUS "CMAKE_C_STANDARD_LATEST='${CMAKE_C_STANDARD_LATEST}'")
+add_executable(StdLatest StdLatest-C.c)
+target_compile_features(StdLatest PRIVATE c_std_${CMAKE_C_STANDARD_LATEST})

+ 1 - 0
Tests/RunCMake/LanguageStandards/StdLatest-CUDA-stdout.txt

@@ -0,0 +1 @@
+-- CMAKE_CUDA_STANDARD_LATEST='[0-9][0-9]'

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-CUDA.cmake

@@ -0,0 +1,4 @@
+enable_language(CUDA)
+message(STATUS "CMAKE_CUDA_STANDARD_LATEST='${CMAKE_CUDA_STANDARD_LATEST}'")
+add_executable(StdLatest StdLatest-CUDA.cu)
+target_compile_features(StdLatest PRIVATE cuda_std_${CMAKE_CUDA_STANDARD_LATEST})

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-CUDA.cu

@@ -0,0 +1,4 @@
+int main()
+{
+  return 0;
+}

+ 1 - 0
Tests/RunCMake/LanguageStandards/StdLatest-CXX-stdout.txt

@@ -0,0 +1 @@
+-- CMAKE_CXX_STANDARD_LATEST='[0-9][0-9]'

+ 5 - 0
Tests/RunCMake/LanguageStandards/StdLatest-CXX.cmake

@@ -0,0 +1,5 @@
+enable_language(CXX)
+set(CMAKE_CXX_SCAN_FOR_MODULES OFF) # In case C++20 or higher is the latest.
+message(STATUS "CMAKE_CXX_STANDARD_LATEST='${CMAKE_CXX_STANDARD_LATEST}'")
+add_executable(StdLatest StdLatest-CXX.cxx)
+target_compile_features(StdLatest PRIVATE cxx_std_${CMAKE_CXX_STANDARD_LATEST})

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-CXX.cxx

@@ -0,0 +1,4 @@
+int main()
+{
+  return 0;
+}

+ 1 - 0
Tests/RunCMake/LanguageStandards/StdLatest-HIP-stdout.txt

@@ -0,0 +1 @@
+-- CMAKE_HIP_STANDARD_LATEST='[0-9][0-9]'

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-HIP.cmake

@@ -0,0 +1,4 @@
+enable_language(HIP)
+message(STATUS "CMAKE_HIP_STANDARD_LATEST='${CMAKE_HIP_STANDARD_LATEST}'")
+add_executable(StdLatest StdLatest-HIP.hip)
+target_compile_features(StdLatest PRIVATE hip_std_${CMAKE_HIP_STANDARD_LATEST})

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-HIP.hip

@@ -0,0 +1,4 @@
+int main()
+{
+  return 0;
+}

+ 1 - 0
Tests/RunCMake/LanguageStandards/StdLatest-OBJC-stdout.txt

@@ -0,0 +1 @@
+-- CMAKE_OBJC_STANDARD_LATEST='[0-9][0-9]'

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-OBJC.cmake

@@ -0,0 +1,4 @@
+enable_language(OBJC)
+message(STATUS "CMAKE_OBJC_STANDARD_LATEST='${CMAKE_OBJC_STANDARD_LATEST}'")
+add_executable(StdLatest StdLatest-OBJC.m)
+set_property(TARGET StdLatest PROPERTY OBJC_STANDARD "${CMAKE_OBJC_STANDARD_LATEST}")

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-OBJC.m

@@ -0,0 +1,4 @@
+int main(void)
+{
+  return 0;
+}

+ 1 - 0
Tests/RunCMake/LanguageStandards/StdLatest-OBJCXX-stdout.txt

@@ -0,0 +1 @@
+-- CMAKE_OBJCXX_STANDARD_LATEST='[0-9][0-9]'

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-OBJCXX.cmake

@@ -0,0 +1,4 @@
+enable_language(OBJCXX)
+message(STATUS "CMAKE_OBJCXX_STANDARD_LATEST='${CMAKE_OBJCXX_STANDARD_LATEST}'")
+add_executable(StdLatest StdLatest-OBJCXX.mm)
+set_property(TARGET StdLatest PROPERTY OBJCXX_STANDARD "${CMAKE_OBJCXX_STANDARD_LATEST}")

+ 4 - 0
Tests/RunCMake/LanguageStandards/StdLatest-OBJCXX.mm

@@ -0,0 +1,4 @@
+int main()
+{
+  return 0;
+}