Browse Source

Merge branch 'fix-crash-on-non-enabled-language-features' into release-3.9

Brad King 8 years ago
parent
commit
fd771df773
27 changed files with 49 additions and 14 deletions
  1. 19 2
      Source/cmMakefile.cxx
  2. 1 1
      Tests/RunCMake/target_compile_features/CMakeLists.txt
  3. 1 0
      Tests/RunCMake/target_compile_features/RunCMakeTest.cmake
  4. 1 1
      Tests/RunCMake/target_compile_features/alias_target-stderr.txt
  5. 1 0
      Tests/RunCMake/target_compile_features/alias_target.cmake
  6. 1 0
      Tests/RunCMake/target_compile_features/cxx_not_enabled-result.txt
  7. 4 0
      Tests/RunCMake/target_compile_features/cxx_not_enabled-stderr.txt
  8. 2 0
      Tests/RunCMake/target_compile_features/cxx_not_enabled.cmake
  9. 1 1
      Tests/RunCMake/target_compile_features/imported_target-stderr.txt
  10. 1 0
      Tests/RunCMake/target_compile_features/imported_target.cmake
  11. 1 1
      Tests/RunCMake/target_compile_features/invalid_args-stderr.txt
  12. 1 0
      Tests/RunCMake/target_compile_features/invalid_args.cmake
  13. 1 1
      Tests/RunCMake/target_compile_features/invalid_args_on_interface-stderr.txt
  14. 1 0
      Tests/RunCMake/target_compile_features/invalid_args_on_interface.cmake
  15. 1 1
      Tests/RunCMake/target_compile_features/no_matching_c_feature-stderr.txt
  16. 1 0
      Tests/RunCMake/target_compile_features/no_matching_c_feature.cmake
  17. 1 1
      Tests/RunCMake/target_compile_features/no_matching_cxx_feature-stderr.txt
  18. 1 0
      Tests/RunCMake/target_compile_features/no_matching_cxx_feature.cmake
  19. 1 1
      Tests/RunCMake/target_compile_features/no_target-stderr.txt
  20. 1 0
      Tests/RunCMake/target_compile_features/no_target.cmake
  21. 1 1
      Tests/RunCMake/target_compile_features/not_a_c_feature-stderr.txt
  22. 1 0
      Tests/RunCMake/target_compile_features/not_a_c_feature.cmake
  23. 1 1
      Tests/RunCMake/target_compile_features/not_a_cxx_feature-stderr.txt
  24. 1 0
      Tests/RunCMake/target_compile_features/not_a_cxx_feature.cmake
  25. 1 1
      Tests/RunCMake/target_compile_features/not_enough_args-stderr.txt
  26. 1 0
      Tests/RunCMake/target_compile_features/not_enough_args.cmake
  27. 1 1
      Tests/RunCMake/target_compile_features/utility_target-stderr.txt

+ 19 - 2
Source/cmMakefile.cxx

@@ -4190,6 +4190,23 @@ bool cmMakefile::CompileFeatureKnown(cmTarget const* target,
 const char* cmMakefile::CompileFeaturesAvailable(const std::string& lang,
                                                  std::string* error) const
 {
+  if (!this->GlobalGenerator->GetLanguageEnabled(lang)) {
+    std::ostringstream e;
+    if (error) {
+      e << "cannot";
+    } else {
+      e << "Cannot";
+    }
+    e << " use features from non-enabled language " << lang;
+    if (error) {
+      *error = e.str();
+    } else {
+      this->GetCMakeInstance()->IssueMessage(cmake::FATAL_ERROR, e.str(),
+                                             this->Backtrace);
+    }
+    return CM_NULLPTR;
+  }
+
   const char* featuresKnown =
     this->GetDefinition("CMAKE_" + lang + "_COMPILE_FEATURES");
 
@@ -4201,9 +4218,9 @@ const char* cmMakefile::CompileFeaturesAvailable(const std::string& lang,
       e << "No";
     }
     e << " known features for " << lang << " compiler\n\""
-      << this->GetDefinition("CMAKE_" + lang + "_COMPILER_ID")
+      << this->GetSafeDefinition("CMAKE_" + lang + "_COMPILER_ID")
       << "\"\nversion "
-      << this->GetDefinition("CMAKE_" + lang + "_COMPILER_VERSION") << ".";
+      << this->GetSafeDefinition("CMAKE_" + lang + "_COMPILER_VERSION") << ".";
     if (error) {
       *error = e.str();
     } else {

+ 1 - 1
Tests/RunCMake/target_compile_features/CMakeLists.txt

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

+ 1 - 0
Tests/RunCMake/target_compile_features/RunCMakeTest.cmake

@@ -11,3 +11,4 @@ run_cmake(not_a_cxx_feature)
 run_cmake(no_matching_cxx_feature)
 run_cmake(not_a_c_feature)
 run_cmake(no_matching_c_feature)
+run_cmake(cxx_not_enabled)

+ 1 - 1
Tests/RunCMake/target_compile_features/alias_target-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at alias_target.cmake:4 \(target_compile_features\):
+CMake Error at alias_target.cmake:[0-9]+ \(target_compile_features\):
   target_compile_features can not be used on an ALIAS target.
 Call Stack \(most recent call first\):
   CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/RunCMake/target_compile_features/alias_target.cmake

@@ -1,3 +1,4 @@
+enable_language(CXX)
 
 add_executable(main empty.cpp)
 add_executable(Alias::Main ALIAS main)

+ 1 - 0
Tests/RunCMake/target_compile_features/cxx_not_enabled-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/target_compile_features/cxx_not_enabled-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at cxx_not_enabled.cmake:[0-9]+ \(target_compile_features\):
+  target_compile_features cannot use features from non-enabled language CXX
+Call Stack \(most recent call first\):
+  CMakeLists.txt:3 \(include\)$

+ 2 - 0
Tests/RunCMake/target_compile_features/cxx_not_enabled.cmake

@@ -0,0 +1,2 @@
+add_executable(main empty.c)
+target_compile_features(main PRIVATE cxx_decltype)

+ 1 - 1
Tests/RunCMake/target_compile_features/imported_target-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at imported_target.cmake:3 \(target_compile_features\):
+CMake Error at imported_target.cmake:[0-9]+ \(target_compile_features\):
   Cannot specify compile features for imported target "main".
 Call Stack \(most recent call first\):
   CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/RunCMake/target_compile_features/imported_target.cmake

@@ -1,3 +1,4 @@
+enable_language(CXX)
 
 add_library(main INTERFACE IMPORTED)
 target_compile_features(main INTERFACE cxx_delegating_constructors)

+ 1 - 1
Tests/RunCMake/target_compile_features/invalid_args-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at invalid_args.cmake:3 \(target_compile_features\):
+CMake Error at invalid_args.cmake:[0-9]+ \(target_compile_features\):
   target_compile_features called with invalid arguments
 Call Stack \(most recent call first\):
   CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/RunCMake/target_compile_features/invalid_args.cmake

@@ -1,3 +1,4 @@
+enable_language(CXX)
 
 add_executable(main empty.cpp)
 target_compile_features(main INVALID cxx_delegating_constructors)

+ 1 - 1
Tests/RunCMake/target_compile_features/invalid_args_on_interface-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at invalid_args_on_interface.cmake:3 \(target_compile_features\):
+CMake Error at invalid_args_on_interface.cmake:[0-9]+ \(target_compile_features\):
   target_compile_features may only be set INTERFACE properties on INTERFACE
   targets
 Call Stack \(most recent call first\):

+ 1 - 0
Tests/RunCMake/target_compile_features/invalid_args_on_interface.cmake

@@ -1,3 +1,4 @@
+enable_language(CXX)
 
 add_library(main INTERFACE)
 target_compile_features(main PRIVATE cxx_delegating_constructors)

+ 1 - 1
Tests/RunCMake/target_compile_features/no_matching_c_feature-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at no_matching_c_feature.cmake:[0-9][0-9]? \((target_compile_features|message)\):
+CMake Error at no_matching_c_feature.cmake:[0-9]+ \((target_compile_features|message)\):
   The compiler feature "gnu_c_dummy" is not known to C compiler
 
   "GNU"

+ 1 - 0
Tests/RunCMake/target_compile_features/no_matching_c_feature.cmake

@@ -1,3 +1,4 @@
+enable_language(CXX)
 
 if (NOT ";${CMAKE_C_COMPILE_FEATURES};" MATCHES ";gnu_c_typeof;")
   # Simulate passing the test.

+ 1 - 1
Tests/RunCMake/target_compile_features/no_matching_cxx_feature-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at no_matching_cxx_feature.cmake:[0-9][0-9]? \((target_compile_features|message)\):
+CMake Error at no_matching_cxx_feature.cmake:[0-9]+ \((target_compile_features|message)\):
   The compiler feature "[^"]+" is not known to CXX compiler
 
   "[^"]*"

+ 1 - 0
Tests/RunCMake/target_compile_features/no_matching_cxx_feature.cmake

@@ -1,3 +1,4 @@
+enable_language(CXX)
 
 if (NOT ";${CMAKE_CXX_COMPILE_FEATURES};" MATCHES ";gnu_cxx_typeof;"
     AND NOT ";${CMAKE_CXX_COMPILE_FEATURES};" MATCHES ";msvc_cxx_sealed;" )

+ 1 - 1
Tests/RunCMake/target_compile_features/no_target-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at no_target.cmake:2 \(target_compile_features\):
+CMake Error at no_target.cmake:[0-9]+ \(target_compile_features\):
   Cannot specify compile features for target "main" which is not built by
   this project.
 Call Stack \(most recent call first\):

+ 1 - 0
Tests/RunCMake/target_compile_features/no_target.cmake

@@ -1,2 +1,3 @@
+enable_language(CXX)
 
 target_compile_features(main INTERFACE cxx_delegating_constructors)

+ 1 - 1
Tests/RunCMake/target_compile_features/not_a_c_feature-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at not_a_c_feature.cmake:3 \(target_compile_features\):
+CMake Error at not_a_c_feature.cmake:[0-9]+ \(target_compile_features\):
   target_compile_features specified unknown feature "c_not_a_feature" for
   target "main".
 Call Stack \(most recent call first\):

+ 1 - 0
Tests/RunCMake/target_compile_features/not_a_c_feature.cmake

@@ -1,3 +1,4 @@
+enable_language(C)
 
 add_executable(main empty.c)
 target_compile_features(main

+ 1 - 1
Tests/RunCMake/target_compile_features/not_a_cxx_feature-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at not_a_cxx_feature.cmake:3 \(target_compile_features\):
+CMake Error at not_a_cxx_feature.cmake:[0-9]+ \(target_compile_features\):
   target_compile_features specified unknown feature "cxx_not_a_feature" for
   target "main".
 Call Stack \(most recent call first\):

+ 1 - 0
Tests/RunCMake/target_compile_features/not_a_cxx_feature.cmake

@@ -1,3 +1,4 @@
+enable_language(CXX)
 
 add_executable(main empty.cpp)
 target_compile_features(main

+ 1 - 1
Tests/RunCMake/target_compile_features/not_enough_args-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at not_enough_args.cmake:3 \(target_compile_features\):
+CMake Error at not_enough_args.cmake:[0-9]+ \(target_compile_features\):
   target_compile_features called with incorrect number of arguments
 Call Stack \(most recent call first\):
   CMakeLists.txt:3 \(include\)

+ 1 - 0
Tests/RunCMake/target_compile_features/not_enough_args.cmake

@@ -1,3 +1,4 @@
+enable_language(CXX)
 
 add_executable(main empty.cpp)
 target_compile_features(main)

+ 1 - 1
Tests/RunCMake/target_compile_features/utility_target-stderr.txt

@@ -1,4 +1,4 @@
-CMake Error at utility_target.cmake:4 \(target_compile_features\):
+CMake Error at utility_target.cmake:[0-9]+ \(target_compile_features\):
   target_compile_features called with non-compilable target type
 Call Stack \(most recent call first\):
   CMakeLists.txt:3 \(include\)