From 6a2eb674667ff14bee8e56a8613676b02cfb5740 Mon Sep 17 00:00:00 2001 From: 191919 <191919@gmail.com> Date: Tue, 23 Jun 2015 09:59:11 -0700 Subject: [PATCH] Fix for clang (llvm 3.7.0+) Summary: Roughly described in https://github.com/facebook/hhvm/issues/5344. Closes #206 Reviewed By: @yfeldblum Differential Revision: D2170803 Pulled By: @sgolemon --- folly/DynamicConverter.h | 13 ++++++++++--- folly/test/DynamicConverterTest.cpp | 4 ++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/folly/DynamicConverter.h b/folly/DynamicConverter.h index 16c3a088..4c8b910c 100644 --- a/folly/DynamicConverter.h +++ b/folly/DynamicConverter.h @@ -54,13 +54,20 @@ BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type); BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator); BOOST_MPL_HAS_XXX_TRAIT_DEF(mapped_type); -template struct class_is_container { - typedef std::reverse_iterator some_iterator; +template struct iterator_class_is_container { + typedef std::reverse_iterator some_iterator; enum { value = has_value_type::value && - has_iterator::value && std::is_constructible::value }; }; +template +using class_is_container = typename + std::conditional< + has_iterator::value, + iterator_class_is_container, + std::false_type + >::type; + template struct class_is_range { enum { value = has_value_type::value && has_iterator::value }; diff --git a/folly/test/DynamicConverterTest.cpp b/folly/test/DynamicConverterTest.cpp index 63bfa022..2e5003de 100644 --- a/folly/test/DynamicConverterTest.cpp +++ b/folly/test/DynamicConverterTest.cpp @@ -35,17 +35,21 @@ TEST(DynamicConverter, template_metaprogramming) { bool c1f = is_container::value; bool c2f = is_container>::value; bool c3f = is_container::value; + bool c4f = class_is_container::value; bool c1t = is_container>::value; bool c2t = is_container>::value; bool c3t = is_container>::value; + bool c4t = class_is_container>::value; EXPECT_EQ(c1f, false); EXPECT_EQ(c2f, false); EXPECT_EQ(c3f, false); + EXPECT_EQ(c4f, false); EXPECT_EQ(c1t, true); EXPECT_EQ(c2t, true); EXPECT_EQ(c3t, true); + EXPECT_EQ(c4t, true); bool m1f = is_map::value; -- 2.34.1