On Mon, Sep 19, 2016 at 5:34 AM, Jonathan Wakely <jwak...@redhat.com> wrote:
> As noted in bugzilla PR 77641 I don't think is_literal_type is the
> right condition for _Uninitialized, because a type can have a
> non-trivial default constructor but still be literal, but that means
> it can't be used in the union in _Variant_storage.
> I'm not sure if the right condition is is_literal &&
> is_trivially_default_constructible, or if this is enough:
I believe that it's a "typo" from me - it should be
is_trivially_destructible, not is_default_constructible (so that we
can avoid using aligned_storage in the corresponding specialization).
is_literal_type works, since literal types are trivially destructible.
> PR libstdc++/77641
> * include/std/variant (__detail::__variant::_Uninitialized): Check
> is_trivially_default_constructible_v instead of is_literal_type_v.
> * testsuite/20_util/variant/compile.cc: Test literal type with
> non-trivial default constructor.
> Tim, are there case that this doesn't handle, where we need is_literal
> as well? (bear in mind that is_trivially_default_constructible also
> depends on trivially destructible).
I checked for is_default_constructible, and all other sites are appropriate.