The intrinsic doesn't check for allowed conversions between scalar types, so restore the std::is_constructible check.
Also make some trivial whitespace changes. PR libstdc++/86398 * include/std/type_traits (is_trivially_constructible): Check is_constructible before __is_trivially_constructible. * testsuite/20_util/is_trivially_constructible/value.cc: Add more tests, including negative cases. * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Use zero for dg-error lineno. * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Likewise. I got sick of repeatedly adjusting the dg-error lines in the make_signed/make_unsigned tests so have just changed them to match any line. Tested powerpc64le-linux, committed to trunk.
commit dfa577ddbb6a4161f23e61fde5ca9ca09753a4ab Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed Jul 4 09:40:07 2018 +0100 PR libstdc++/86398 fix std::is_trivially_constructible regression The intrinsic doesn't check for allowed conversions between scalar types, so restore the std::is_constructible check. Also make some trivial whitespace changes. PR libstdc++/86398 * include/std/type_traits (is_trivially_constructible): Check is_constructible before __is_trivially_constructible. * testsuite/20_util/is_trivially_constructible/value.cc: Add more tests, including negative cases. * testsuite/20_util/make_signed/requirements/typedefs_neg.cc: Use zero for dg-error lineno. * testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: Likewise. diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index accea6df648..4df82bf6d8c 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -1136,7 +1136,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION /// is_trivially_constructible template<typename _Tp, typename... _Args> struct is_trivially_constructible - : public __bool_constant<__is_trivially_constructible(_Tp, _Args...)> + : public __and_<is_constructible<_Tp, _Args...>, __bool_constant< + __is_trivially_constructible(_Tp, _Args...)>>::type { }; /// is_trivially_default_constructible @@ -1159,21 +1160,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct __is_implicitly_default_constructible_impl - : public __do_is_implicitly_default_constructible_impl - { - typedef decltype(__test(declval<_Tp>())) type; - }; + : public __do_is_implicitly_default_constructible_impl + { + typedef decltype(__test(declval<_Tp>())) type; + }; template<typename _Tp> struct __is_implicitly_default_constructible_safe - : public __is_implicitly_default_constructible_impl<_Tp>::type - { }; + : public __is_implicitly_default_constructible_impl<_Tp>::type + { }; template <typename _Tp> struct __is_implicitly_default_constructible - : public __and_<is_default_constructible<_Tp>, - __is_implicitly_default_constructible_safe<_Tp>> - { }; + : public __and_<is_default_constructible<_Tp>, + __is_implicitly_default_constructible_safe<_Tp>> + { }; /// is_trivially_copy_constructible diff --git a/libstdc++-v3/testsuite/20_util/is_trivially_constructible/value.cc b/libstdc++-v3/testsuite/20_util/is_trivially_constructible/value.cc index d2ab27df86f..f260c2a7927 100644 --- a/libstdc++-v3/testsuite/20_util/is_trivially_constructible/value.cc +++ b/libstdc++-v3/testsuite/20_util/is_trivially_constructible/value.cc @@ -44,124 +44,140 @@ void test01() using std::is_trivially_constructible; using namespace __gnu_test; - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, int>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, int, int>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, int, int&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, int, int&&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, int, const int&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, + int, void*>(false), "PR 86398"); + static_assert(test_property<is_trivially_constructible, + int, int*>(false), "PR 86398"); + static_assert(test_property<is_trivially_constructible, + int, const int*>(false), "PR 86398"); + static_assert(test_property<is_trivially_constructible, + int*, void*>(false), "PR 86398"); + static_assert(test_property<is_trivially_constructible, + int*, const int*>(false), "PR 86398"); + static_assert(test_property<is_trivially_constructible, + int&, const int>(false), ""); + static_assert(test_property<is_trivially_constructible, + const int&, int>(true), ""); + static_assert(test_property<is_trivially_constructible, + const int&, int&>(true), ""); + static_assert(test_property<is_trivially_constructible, + const int*, int*>(true), ""); + static_assert(test_property<is_trivially_constructible, PolymorphicClass>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, PolymorphicClass, PolymorphicClass>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, PolymorphicClass, PolymorphicClass&>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, PolymorphicClass, PolymorphicClass&&>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, PolymorphicClass, const PolymorphicClass&>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, TType>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, TType, TType>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, TType, TType&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, TType, TType&&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, TType, const TType&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, TType, int, int>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, PODType>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, PODType, PODType>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, PODType, PODType&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, PODType, PODType&&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, PODType, const PODType&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, PODType, int, int>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, NType>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, SLType>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, LType>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, LType, int>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, construct::DelDef>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, construct::Abstract>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, construct::Ellipsis>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, construct::DelEllipsis>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, construct::Any>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, construct::DelCopy>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, construct::DelCopy, const construct::DelCopy&>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, construct::DelDtor>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, construct::Nontrivial>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, construct::UnusualCopy>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, CopyConsOnlyType>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, CopyConsOnlyType, CopyConsOnlyType>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, CopyConsOnlyType, CopyConsOnlyType&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, CopyConsOnlyType, CopyConsOnlyType&&>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, CopyConsOnlyType, const CopyConsOnlyType&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveConsOnlyType>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveConsOnlyType, MoveConsOnlyType>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveConsOnlyType, MoveConsOnlyType&>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveConsOnlyType, MoveConsOnlyType&&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveConsOnlyType, const MoveConsOnlyType&>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, ClassType, DerivedType>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, ClassType, DerivedType&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, ClassType, DerivedType&&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, ClassType, const DerivedType&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, HasTemplateCCtor>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, HasTemplateCCtor, HasTemplateCCtor>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, HasTemplateCCtor, const HasTemplateCCtor&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveOnly>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveOnly, MoveOnly>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveOnly, MoveOnly&>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveOnly, MoveOnly&&>(true), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveOnly, const MoveOnly&>(false), ""); - static_assert(test_property<is_trivially_constructible, + static_assert(test_property<is_trivially_constructible, MoveOnly2>(false), ""); - - } diff --git a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc index 1380fc55c82..53cdf61f496 100644 --- a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc +++ b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc @@ -47,4 +47,4 @@ void test01() // { dg-error "required from here" "" { target *-*-* } 39 } // { dg-error "required from here" "" { target *-*-* } 41 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1825 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc index cbc5300c182..ec5b6111127 100644 --- a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc +++ b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc @@ -47,5 +47,4 @@ void test01() // { dg-error "required from here" "" { target *-*-* } 39 } // { dg-error "required from here" "" { target *-*-* } 41 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 1708 } - +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 0 }