vsapsai added inline comments.

================
Comment at: libcxx/include/memory:1479
+struct __has_construct_missing
+    : false_type
+{
----------------
erik.pilkington wrote:
> vsapsai wrote:
> > erik.pilkington wrote:
> > > Shouldn't this be true_type?
> > I see this is confusing and I'm still struggling how to express it. The 
> > issue is that in C++03 `__has_construct` should be something like unknown, 
> > so that neither `__has_construct` nor `! __has_construct` evaluate to true 
> > because we don't really know if allocator has construct. This case is 
> > covered by the added test, in C++03 the memcpy specialization was enabled 
> > when
> > 
> > ```
> >     is_same<allocator_type, allocator<_Tp> >
> >       || !false_type
> > ```
> > 
> > So `is_same` check had no effect and we were using memcpy to convert 
> > between int and float.
> > 
> > I was considering using something like
> > 
> > ```lang=c++
> >         typename enable_if
> >         <
> >             (is_same
> >              <
> >                 typename _VSTD::remove_const<typename 
> > allocator_type::value_type>::type,
> >                 typename _VSTD::remove_const<_SourceTp>::type
> >              >::value
> > #ifndef _LIBCPP_CXX03_LANG
> >                 || !__has_construct<allocator_type, _DestTp*, 
> > _SourceTp>::value
> > #endif
> >             ) &&
> >              is_trivially_move_constructible<_DestTp>::value,
> >             void
> >         >::type
> > ```
> > 
> > But that doesn't look readable to me, so I've introduced ad-hoc ternary 
> > logic with `__has_construct_missing`.
> Oh I see, yikes! That's a pretty bad bug. I agree that this fix is best then, 
> but can you add a comment explaining this to `__has_construct_missing` for 
> future casual readers? Also, I think we should move the 
> __has_construct_missing bugfix into a different (prerequisite) patch. Seems 
> unrelated to the `const` related optimization below.
The bug as I described isn't really present now because function signature

    __construct_range_forward(allocator_type&, _Tp* __begin1, _Tp* __end1, 
_Tp*& __begin2)

works as implicit `is_same` for `__begin1` and `__begin2` types. I think it is 
worth fixing separately and there is a bug with C++03 and custom allocators.


https://reviews.llvm.org/D48342



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to