libstdc++: Fix is_trivially_constructible (PR 94033)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 18 Mar 2020 23:19:12 +0000 (23:19 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 18 Mar 2020 23:19:35 +0000 (23:19 +0000)
commitb3341826531e80e02f194460b4fbe1b0541c0463
tree9c228923d0a965edfd8aecbed34a3f89f67e363e
parent07fe4af4d51d74b63a76ea632d4db01d1f69f037
libstdc++: Fix is_trivially_constructible (PR 94033)

This attempts to make is_nothrow_constructible more robust (and
efficient to compile) by not depending on is_constructible. Instead the
__is_constructible intrinsic is used directly. The helper class
__is_nt_constructible_impl which checks whether the construction is
non-throwing now takes a bool template parameter that is substituted by
the result of the instrinsic. This fixes the reported bug by not using
the already-instantiated (and incorrect) value of std::is_constructible.
I don't think it really fixes the problem in general, because
std::is_nothrow_constructible itself could already have been
instantiated in a context where it gives the wrong result. A proper fix
needs to be done in the compiler.

PR libstdc++/94033
* include/std/type_traits (__is_nt_default_constructible_atom): Remove.
(__is_nt_default_constructible_impl): Remove.
(__is_nothrow_default_constructible_impl): Remove.
(__is_nt_constructible_impl): Add bool template parameter. Adjust
partial specializations.
(__is_nothrow_constructible_impl): Replace class template with alias
template.
(is_nothrow_default_constructible): Derive from alias template
__is_nothrow_constructible_impl instead of
__is_nothrow_default_constructible_impl.
* testsuite/20_util/is_nothrow_constructible/94003.cc: New test.
libstdc++-v3/ChangeLog
libstdc++-v3/include/std/type_traits
libstdc++-v3/testsuite/20_util/is_nothrow_constructible/94003.cc [new file with mode: 0644]