Browse Source

Features: Fix COMPILE_FEATURES genex for C++ 14 and 17 features

When `CXX_STANDARD` is not at least 14 or 17, features enabled by the
compiler for those standards should not be reported as existing by the
`COMPILE_FEATURES` genex.  Fix the implementation and add a test.
Brad King 8 years ago
parent
commit
4f7d9eef51
3 changed files with 32 additions and 0 deletions
  1. 12 0
      Source/cmMakefile.cxx
  2. 8 0
      Tests/CompileFeatures/CMakeLists.txt
  3. 12 0
      Tests/CompileFeatures/genex_test.cpp

+ 12 - 0
Source/cmMakefile.cxx

@@ -4381,6 +4381,18 @@ bool cmMakefile::HaveCxxStandardAvailable(cmTarget const* target,
                    cmStrCmp(existingCxxStandard))
     : cmArrayEnd(CXX_STANDARDS);
 
+  if (needCxx17 &&
+      existingCxxIt < std::find_if(cmArrayBegin(CXX_STANDARDS),
+                                   cmArrayEnd(CXX_STANDARDS),
+                                   cmStrCmp("17"))) {
+    return false;
+  }
+  if (needCxx14 &&
+      existingCxxIt < std::find_if(cmArrayBegin(CXX_STANDARDS),
+                                   cmArrayEnd(CXX_STANDARDS),
+                                   cmStrCmp("14"))) {
+    return false;
+  }
   if (needCxx11 &&
       existingCxxIt < std::find_if(cmArrayBegin(CXX_STANDARDS),
                                    cmArrayEnd(CXX_STANDARDS),

+ 8 - 0
Tests/CompileFeatures/CMakeLists.txt

@@ -428,6 +428,14 @@ else()
     HAVE_FINAL=$<COMPILE_FEATURES:cxx_final>
     HAVE_INHERITING_CONSTRUCTORS_AND_FINAL=$<COMPILE_FEATURES:cxx_inheriting_constructors,cxx_final>
   )
+  if (CMAKE_CXX_STANDARD_DEFAULT)
+    target_compile_definitions(CompileFeaturesGenex PRIVATE
+      TEST_CXX_STD
+      HAVE_CXX_STD_11=$<COMPILE_FEATURES:cxx_std_11>
+      HAVE_CXX_STD_14=$<COMPILE_FEATURES:cxx_std_14>
+      HAVE_CXX_STD_17=$<COMPILE_FEATURES:cxx_std_17>
+    )
+  endif()
 
   add_executable(CompileFeaturesGenex2 genex_test.cpp)
   target_compile_features(CompileFeaturesGenex2 PRIVATE cxx_std_11)

+ 12 - 0
Tests/CompileFeatures/genex_test.cpp

@@ -11,6 +11,18 @@
 #error EXPECT_OVERRIDE_CONTROL not defined
 #endif
 
+#ifdef TEST_CXX_STD
+#if !HAVE_CXX_STD_11
+#error HAVE_CXX_STD_11 is false with CXX_STANDARD == 11
+#endif
+#if HAVE_CXX_STD_14
+#error HAVE_CXX_STD_14 is true with CXX_STANDARD == 11
+#endif
+#if HAVE_CXX_STD_17
+#error HAVE_CXX_STD_17 is true with CXX_STANDARD == 11
+#endif
+#endif
+
 #if !HAVE_OVERRIDE_CONTROL
 #if EXPECT_OVERRIDE_CONTROL
 #error "Expect override control feature"