Unbreak is_constructible tests for Clang <= 3.7.

There is a bug in Clang's __is_constructible builtin that causes it
to return true for function types; ex [T = void()].

llvm-svn: 276092
This commit is contained in:
Eric Fiselier 2016-07-20 06:36:11 +00:00
parent d5b5359802
commit 85acffa676
2 changed files with 25 additions and 1 deletions

View File

@ -151,9 +151,21 @@ int main()
test_is_constructible<PrivateDtor&, PrivateDtor&>(); test_is_constructible<PrivateDtor&, PrivateDtor&>();
test_is_not_constructible<PrivateDtor, int>(); test_is_not_constructible<PrivateDtor, int>();
test_is_not_constructible<void() const, void() const>();
test_is_not_constructible<void() const, void*>();
// TODO: Remove this workaround once Clang <= 3.7 are no longer used regularly.
// In those compiler versions the __is_constructible builtin gives the wrong
// results for abominable function types.
#if defined(__clang__) && __clang_major__ == 3 && __clang_minor__ < 8
#define WORKAROUND_CLANG_BUG
#endif
#if !defined(WORKAROUND_CLANG_BUG)
test_is_not_constructible<void()>();
test_is_not_constructible<void() const> (); test_is_not_constructible<void() const> ();
test_is_not_constructible<void() volatile> (); test_is_not_constructible<void() volatile> ();
test_is_not_constructible<void() &> (); test_is_not_constructible<void() &> ();
test_is_not_constructible<void() &&> (); test_is_not_constructible<void() &&> ();
#endif #endif
#endif
} }

View File

@ -107,7 +107,19 @@ int main()
#if TEST_STD_VER >= 11 #if TEST_STD_VER >= 11
test_is_not_default_constructible<B>(); test_is_not_default_constructible<B>();
test_is_not_default_constructible<int&&>(); test_is_not_default_constructible<int&&>();
// TODO: Remove this workaround once Clang <= 3.7 are no longer used regularly.
// In those compiler versions the __is_constructible builtin gives the wrong
// results for abominable function types.
#if defined(__clang__) && __clang_major__ == 3 && __clang_minor__ < 8
#define WORKAROUND_CLANG_BUG
#endif
#if !defined(WORKAROUND_CLANG_BUG)
test_is_not_default_constructible<void()>(); test_is_not_default_constructible<void()>();
test_is_not_default_constructible<void() const> (); test_is_not_default_constructible<void() const> ();
test_is_not_default_constructible<void() volatile> ();
test_is_not_default_constructible<void() &> ();
test_is_not_default_constructible<void() &&> ();
#endif
#endif #endif
} }