[llvm] r230021 - Base isPodLike on is_trivially_copyable for GCC 5 and MSVC
Duncan P. N. Exon Smith
dexonsmith at apple.com
Wed Feb 25 17:57:44 PST 2015
> On 2015 Feb 20, at 08:57, Benjamin Kramer <benny.kra at gmail.com> wrote:
>
> On Fri, Feb 20, 2015 at 5:35 PM, Chandler Carruth <chandlerc at google.com> wrote:
>> I think we end up relying on this for more than just copyable. We also skip
>> destructor calls in some places etc.
>>
>> Would it be better to change the users of this to use the more precise
>> names? We can provide wrappers with version checks and defaulr fallbacks
>> based on explicit specializations of the old trait.
>>
>> Thoughts?
>
> Right, isPodLike is really broad and the only thing we use in the
> ADT's to pick a simpler code path for memcpyable types. The semantics
> just happen to match std::is_trivially_copyable for historical
> reasons, is_trivially_copyable is defined to return false for all
> classes with non-trivial dtors so this also works for dtor skipping.
>
> It would be better to have an 'is_memcpyable' trait that also returns
> true for things like std::unique_ptr, where we can use memcpy to move
> them around but can't skip dtors
BTW, I'd rather spell this `is_memcpy_moveable` or something, but I
think it's an interesting idea. Even `DenseMap` can be moved via
`memcpy()`.
> , and a separate 'can_skip_dtors'
> trait. Both can use std::is_trivially_copyable as a baseline.
>
> I've been meaning to do this for a while but couldn't find enough
> motivation to refactor SmallVector's template heap to support all of
> this ;)
>
> - Ben
>
>> On Feb 20, 2015 8:26 AM, "Benjamin Kramer" <benny.kra at googlemail.com> wrote:
>>>
>>> Author: d0k
>>> Date: Fri Feb 20 10:19:28 2015
>>> New Revision: 230021
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=230021&view=rev
>>> Log:
>>> Base isPodLike on is_trivially_copyable for GCC 5 and MSVC
>>>
>>> It would be nice to get rid of the version checks here, but that will
>>> have to wait until libstdc++ is upgraded to 5.0 everywhere ...
>>>
>>> Modified:
>>> llvm/trunk/include/llvm/Support/type_traits.h
>>>
>>> Modified: llvm/trunk/include/llvm/Support/type_traits.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/type_traits.h?rev=230021&r1=230020&r2=230021&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Support/type_traits.h (original)
>>> +++ llvm/trunk/include/llvm/Support/type_traits.h Fri Feb 20 10:19:28 2015
>>> @@ -28,9 +28,17 @@ namespace llvm {
>>> /// type can be copied around with memcpy instead of running ctors etc.
>>> template <typename T>
>>> struct isPodLike {
>>> -#if __has_feature(is_trivially_copyable)
>>> + // std::is_trivially copyable is available in libc++ with clang,
>>> libstdc++
>>> + // that comes with GCC 5 and MSVC 2013.
>>> +#if (__has_feature(is_trivially_copyable) && defined(_LIBCPP_VERSION)) ||
>>> \
>>> + (defined(__GNUC__) && __GNUC__ >= 5) || defined(_MSC_VER)
>>> // If the compiler supports the is_trivially_copyable trait use it, as
>>> it
>>> // matches the definition of isPodLike closely.
>>> + static const bool value = std::is_trivially_copyable<T>::value;
>>> +#elif __has_feature(is_trivially_copyable)
>>> + // Use the internal name if the compiler supports is_trivially_copyable
>>> but we
>>> + // don't know if the standard library does. This is the case for clang
>>> in
>>> + // conjunction with libstdc++ from GCC 4.x.
>>> static const bool value = __is_trivially_copyable(T);
>>> #else
>>> // If we don't know anything else, we can (at least) assume that all
>>> non-class
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list