Commit Graph

21 Commits

Author SHA1 Message Date
Howard Hinnant
11a50ac497 Richard Smith: It was pointed out to me off-list that libc++'s non-compiler-builtin
implementation of std::is_polymorphic does this:

template <class _Tp> struct __is_polymorphic1 : public _Tp {};

... and that g++ rejects this if _Tp has an inaccessible virtual destructor
(because __is_polymorphic1<_Tp> would have a deleted virtual destructor
overriding _Tp's non-deleted destructor). Clang was failing to reject this;
I've fixed that in r178563, but that causes libc++'s corresponding test
case to fail with both clang and gcc when using the fallback
implementation. The fallback code also incorrectly rejects final types.

The attached patch fixes the fallback implementation of is_polymorphic; we
now use dynamic_cast's detection of polymorphic class types rather than
trying to determine if adding a virtual function makes the type larger:

  enable_if<sizeof((_Tp*)dynamic_cast<const volatile
void*>(declval<_Tp*>())) != 0, ...>

Two things of note here:
* the (_Tp*) cast is necessary to work around bugs in Clang and g++ where
we otherwise don't instantiate the dynamic_cast (filed as PR15656)
* the 'const volatile' is here to treat is_polymorphic<cv T> as true for a
polymorphic class type T -- my reading of the standard suggests this is
incorrect, but it matches our builtin __is_polymorphic and gcc


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@178576 91177308-0d34-0410-b5e6-96231b3b80d8
2013-04-02 21:25:06 +00:00
Howard Hinnant
4300839b5f Hook up to the new clang __is_trivially_constructible and __is_trivially_assignable traits. Fixes r10925427 and http://llvm.org/bugs/show_bug.cgi?id=12038.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@151406 91177308-0d34-0410-b5e6-96231b3b80d8
2012-02-24 23:32:26 +00:00
Howard Hinnant
1694d23e23 noexcept for <memory>. I've added a few extension noexcept to: allocator_traits<A>::deallocate, allocaate<T>::deallocate, return_temporary_buffer, and default_delete<T>::operator()(T*) const. My rationale was: If a std-dicated noexcept function needs to call another std-defined function, that called function must be noexcept. We're all a little new to noexcept, so things like this are to be expected. Also included fix for broken __is_swappable trait pointed out by Marc Glisse, thanks Marc|. And fixed a test case for is_nothrow_destructible. Destructors are now noexcept by default|
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@132261 91177308-0d34-0410-b5e6-96231b3b80d8
2011-05-28 14:41:13 +00:00
Howard Hinnant
6063ec176d A much improved type_traits for C++0x. Not yet done: is_trivially_constructible, is_trivially_assignable and underlying_type.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@131291 91177308-0d34-0410-b5e6-96231b3b80d8
2011-05-13 14:08:16 +00:00
Howard Hinnant
091f2ab44f Update testsuite strucuture to latest draft
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@120029 91177308-0d34-0410-b5e6-96231b3b80d8
2010-11-23 19:15:49 +00:00
Howard Hinnant
1468b668aa N3142. Many of these traits are just placeholders with medium quality emulation; waiting on compiler intrinsics to do it right.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@119854 91177308-0d34-0410-b5e6-96231b3b80d8
2010-11-19 22:17:28 +00:00
Howard Hinnant
b64f8b07c1 license change
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@119395 91177308-0d34-0410-b5e6-96231b3b80d8
2010-11-16 22:09:02 +00:00
Howard Hinnant
745d473ac1 Hooked the following up to clang: is_class, is_enum, has_nothrow_copy_assign, has_trivial_destructor, has_virtual_destructor, is_pod. Implemented has_copy_assign.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113373 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-08 17:55:32 +00:00
Howard Hinnant
27031115bf has_nothrow_copy_assign hooked up to clang
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113364 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-08 16:39:18 +00:00
Howard Hinnant
99ad765261 has_trivial_copy_assign hooked up to clang (without workarounds). Filed http://llvm.org/bugs/show_bug.cgi?id=8109 to take care of several types which don't work yet. If there is some reason we don't want to handle these types in the compiler, I can handle most of them in the library.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113312 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-07 23:38:59 +00:00
Howard Hinnant
954b366317 Made a stab at has_copy_constructor. Got it mostly working for g++-4.0, but only works for scalar types on clang. Ultimately this needs a compiler-supported is_constructible which clang is missing, and won't be able to use until it gets variadic templates.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113304 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-07 23:11:28 +00:00
Howard Hinnant
aad0db393f has_nothrow_copy_constructor hooked up to clang. Filed http://llvm.org/bugs/show_bug.cgi?id=8107 to take care of several types which don't work yet. If there is some reason we don't want to handle these types in the compiler, I can handle most of them in the library.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113294 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-07 22:09:07 +00:00
Howard Hinnant
87eea6d801 has_trivial_copy_constructor hooked up to clang. Filed http://llvm.org/bugs/show_bug.cgi?id=8105 to take care of void, arrays of incomplete bounds and complete bounds which don't work yet. If there is some reason we don't want to handle these types in the compiler, I can handle them in the library.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113270 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-07 20:31:18 +00:00
Howard Hinnant
bb73d762b2 Made a stab at has_default_constructor. Got it mostly working for g++-4.0, but only works for scalar types on clang. Ultimately this needs a compiler-supported is_constructible which clang is missing, and won't be able to use until it gets variadic templates.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113225 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-07 17:47:31 +00:00
Howard Hinnant
6fd2e09b36 has_nothrow_default_constructor hooked up to clang. Filed http://llvm.org/bugs/show_bug.cgi?id=8101 to take care of void, arrays of incomplete types, and classes with virtual destructors which don't work yet. If there is some reasons we don't want to handle these types in the compiler, I can handle them in the library.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113217 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-07 17:15:17 +00:00
Howard Hinnant
2fd6d25bf1 has_trivial_default_constructor hooked up to clang. Filed http://llvm.org/bugs/show_bug.cgi?id=8097 to take care of void and arrays of incomplete types which don't work yet. If there is some reasons we don't want to handle these types in the compiler, I can handle them in the library.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113205 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-07 15:53:26 +00:00
Howard Hinnant
1387038988 Working the type_traits area: Hooked up to clang's __is_union. Got has_trivial_copy_assign working.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113162 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-06 19:10:31 +00:00
Howard Hinnant
73d21a4f07 Changed __config to react to all of clang's currently documented has_feature flags, and renamed _LIBCPP_MOVE to _LIBCPP_HAS_NO_RVALUE_REFERENCES to be more consistent with the rest of the libc++'s flags, and with clang's nomenclature.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113086 91177308-0d34-0410-b5e6-96231b3b80d8
2010-09-04 23:28:19 +00:00
Howard Hinnant
c52f43e72d Fixing whitespace problems
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@111767 91177308-0d34-0410-b5e6-96231b3b80d8
2010-08-22 00:59:46 +00:00
Howard Hinnant
f5256e16df Wiped out some non-ascii characters that snuck into the copyright.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@103516 91177308-0d34-0410-b5e6-96231b3b80d8
2010-05-11 21:36:01 +00:00
Howard Hinnant
bc8d3f97eb libcxx initial import
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@103490 91177308-0d34-0410-b5e6-96231b3b80d8
2010-05-11 19:42:16 +00:00