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.
This commit is contained in:
Brad King 2017-08-08 10:46:00 -04:00
parent bfdfc6db9d
commit 4f7d9eef51
3 changed files with 32 additions and 0 deletions

View File

@ -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),

View File

@ -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)

View File

@ -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"