Merge topic 'fix-static-assert'

e2f25d3e WriteCompilerDetectionHeader: fix STATIC_ASSERT

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !555
This commit is contained in:
Brad King 2017-03-08 13:39:02 +00:00 committed by Kitware Robot
commit 45ca6e739a
3 changed files with 19 additions and 4 deletions

View File

@ -503,10 +503,19 @@ function(write_compiler_detection_header
if (feature STREQUAL cxx_static_assert)
set(def_value "${prefix_arg}_STATIC_ASSERT(X)")
set(def_value_msg "${prefix_arg}_STATIC_ASSERT_MSG(X, MSG)")
set(static_assert_struct "template<bool> struct ${prefix_arg}StaticAssert;\ntemplate<> struct ${prefix_arg}StaticAssert<true>{};\n")
set(def_standard "# define ${def_value} static_assert(X, #X)\n# define ${def_value_msg} static_assert(X, MSG)")
set(def_alternative "${static_assert_struct}# define ${def_value} sizeof(${prefix_arg}StaticAssert<X>)\n# define ${def_value_msg} sizeof(${prefix_arg}StaticAssert<X>)")
string(APPEND file_content "# if defined(${def_name}) && ${def_name}\n${def_standard}\n# else\n${def_alternative}\n# endif\n\n")
set(def_fallback "enum { ${prefix_arg}_STATIC_ASSERT_JOIN(${prefix_arg}StaticAssertEnum, __LINE__) = sizeof(${prefix_arg}StaticAssert<X>) }")
string(APPEND file_content "# if defined(${def_name}) && ${def_name}
# define ${def_value} static_assert(X, #X)
# define ${def_value_msg} static_assert(X, MSG)
# else
# define ${prefix_arg}_STATIC_ASSERT_JOIN(X, Y) ${prefix_arg}_STATIC_ASSERT_JOIN_IMPL(X, Y)
# define ${prefix_arg}_STATIC_ASSERT_JOIN_IMPL(X, Y) X##Y
template<bool> struct ${prefix_arg}StaticAssert;
template<> struct ${prefix_arg}StaticAssert<true>{};
# define ${def_value} ${def_fallback}
# define ${def_value_msg} ${def_fallback}
# endif
\n")
endif()
if (feature STREQUAL cxx_alignas)
set(def_value "${prefix_arg}_ALIGNAS(X)")

View File

@ -8,6 +8,9 @@
#error Expect no C features defined
#endif
TEST_STATIC_ASSERT(true);
TEST_STATIC_ASSERT_MSG(true, "msg");
int main()
{
return 0;

View File

@ -8,6 +8,9 @@
#error Expect no C features defined
#endif
MULTI_STATIC_ASSERT(true);
MULTI_STATIC_ASSERT_MSG(true, "msg");
int main()
{
return 0;