Jelajahi Sumber

Merge topic 'cxxmodules-verify-c++20' into release-3.28

7ac696549a cxxmodules: Fix CMP0155 NEW behavior when C++ compile features are not known

Acked-by: Kitware Robot <[email protected]>
Tested-by: buildbot <[email protected]>
Merge-request: !8857
Brad King 2 tahun lalu
induk
melakukan
bbba1879ff
1 mengubah file dengan 18 tambahan dan 11 penghapusan
  1. 18 11
      Source/cmGeneratorTarget.cxx

+ 18 - 11
Source/cmGeneratorTarget.cxx

@@ -9093,20 +9093,27 @@ cmGeneratorTarget::Cxx20SupportLevel cmGeneratorTarget::HaveCxxModuleSupport(
   if (!state->GetLanguageEnabled("CXX")) {
     return Cxx20SupportLevel::MissingCxx;
   }
+
   cmValue standardDefault =
-    this->Target->GetMakefile()->GetDefinition("CMAKE_CXX_STANDARD_DEFAULT");
-  if (standardDefault && !standardDefault->empty()) {
-    cmStandardLevelResolver standardResolver(this->Makefile);
-    if (!standardResolver.HaveStandardAvailable(this, "CXX", config,
-                                                "cxx_std_20")) {
-      return Cxx20SupportLevel::NoCxx20;
-    }
+    this->Makefile->GetDefinition("CMAKE_CXX_STANDARD_DEFAULT");
+  if (!standardDefault || standardDefault->empty()) {
+    // We do not know any meaningful C++ standard levels for this compiler.
+    return Cxx20SupportLevel::NoCxx20;
+  }
+
+  cmStandardLevelResolver standardResolver(this->Makefile);
+  if (!standardResolver.HaveStandardAvailable(this, "CXX", config,
+                                              "cxx_std_20") ||
+      // During the ABI detection step we do not know the compiler's features.
+      // HaveStandardAvailable may return true as a fallback, but in this code
+      // path we do not want to assume C++ 20 is available.
+      this->Makefile->GetDefinition("CMAKE_CXX20_COMPILE_FEATURES")
+        .IsEmpty()) {
+    return Cxx20SupportLevel::NoCxx20;
   }
-  // Else, an empty CMAKE_CXX_STANDARD_DEFAULT means CMake does not detect and
-  // set a default standard level for this compiler, so assume all standards
-  // are available.
+
   cmValue scandepRule =
-    this->Target->GetMakefile()->GetDefinition("CMAKE_CXX_SCANDEP_SOURCE");
+    this->Makefile->GetDefinition("CMAKE_CXX_SCANDEP_SOURCE");
   if (!scandepRule) {
     return Cxx20SupportLevel::MissingRule;
   }