From: Jonathan Wakely Date: Thu, 6 Jun 2019 12:13:47 +0000 (+0100) Subject: Remove redundant static assertions in [meta.unary.prop] traits X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=209ee62421fdeb177bdac29e670bc9b930bef4a3;p=gcc.git Remove redundant static assertions in [meta.unary.prop] traits The type property predicates that are implemented by a compiler builtin already do the right checks in the compiler. The checks for complete type or unbounded arrays were wrong for these types anyway. * include/std/type_traits (is_empty, is_polymorphic, is_final) (is_abstract, is_aggregate): Remove static_assert. * testsuite/20_util/is_abstract/incomplete_neg.cc: Check for error from builtin only. * testsuite/20_util/is_aggregate/incomplete_neg.cc: Likewise. Add missing -std=gnu++17 option. * testsuite/20_util/is_empty/incomplete_neg.cc: New test. * testsuite/20_util/is_final/incomplete_neg.cc: New test. * testsuite/20_util/is_polymorphic/incomplete_neg.cc: Check for error from builtin only. From-SVN: r272000 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 283c6b9e057..3dd82b637ff 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,16 @@ 2019-06-06 Jonathan Wakely + * include/std/type_traits (is_empty, is_polymorphic, is_final) + (is_abstract, is_aggregate): Remove static_assert. + * testsuite/20_util/is_abstract/incomplete_neg.cc: Check for error + from builtin only. + * testsuite/20_util/is_aggregate/incomplete_neg.cc: Likewise. Add + missing -std=gnu++17 option. + * testsuite/20_util/is_empty/incomplete_neg.cc: New test. + * testsuite/20_util/is_final/incomplete_neg.cc: New test. + * testsuite/20_util/is_polymorphic/incomplete_neg.cc: Check for error + from builtin only. + * testsuite/18_support/set_terminate.cc: Do not run for C++98 mode. * testsuite/18_support/set_unexpected.cc: Likewise. * testsuite/20_util/is_nothrow_invocable/value.cc: Test converting to diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 78a113af415..e53d3c8d535 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -746,19 +746,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct is_empty : public integral_constant - { - static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}), - "template argument must be a complete class or an unbounded array"); - }; + { }; /// is_polymorphic template struct is_polymorphic : public integral_constant - { - static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}), - "template argument must be a complete class or an unbounded array"); - }; + { }; #if __cplusplus >= 201402L #define __cpp_lib_is_final 201402L @@ -766,20 +760,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct is_final : public integral_constant - { - static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}), - "template argument must be a complete class or an unbounded array"); - }; + { }; #endif /// is_abstract template struct is_abstract : public integral_constant - { - static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}), - "template argument must be a complete class or an unbounded array"); - }; + { }; template::value> @@ -3174,10 +3162,7 @@ template template struct is_aggregate : bool_constant<__is_aggregate(remove_cv_t<_Tp>)> - { - static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}), - "template argument must be a complete class or an unbounded array"); - }; + { }; /// is_aggregate_v template diff --git a/libstdc++-v3/testsuite/20_util/is_abstract/incomplete_neg.cc b/libstdc++-v3/testsuite/20_util/is_abstract/incomplete_neg.cc index 94f4ecd6000..a2a73d01a06 100644 --- a/libstdc++-v3/testsuite/20_util/is_abstract/incomplete_neg.cc +++ b/libstdc++-v3/testsuite/20_util/is_abstract/incomplete_neg.cc @@ -1,7 +1,5 @@ // { dg-do compile { target c++11 } } -// { dg-prune-output "invalid use of incomplete type" } -// { dg-prune-output "must be a complete" } -// + // Copyright (C) 2019 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -19,6 +17,9 @@ // with this library; see the file COPYING3. If not see // . +// Expect the compiler builtin to do the completeness check. +// { dg-error "incomplete type" "" { target *-*-* } 0 } + #include class X; diff --git a/libstdc++-v3/testsuite/20_util/is_aggregate/incomplete_neg.cc b/libstdc++-v3/testsuite/20_util/is_aggregate/incomplete_neg.cc index 8a3dd551cbb..eff3f64c476 100644 --- a/libstdc++-v3/testsuite/20_util/is_aggregate/incomplete_neg.cc +++ b/libstdc++-v3/testsuite/20_util/is_aggregate/incomplete_neg.cc @@ -1,5 +1,6 @@ +// { dg-options "-std=gnu++17" } // { dg-do compile { target c++17 } } -// + // Copyright (C) 2019 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -17,7 +18,8 @@ // with this library; see the file COPYING3. If not see // . -// { dg-error "must be a complete class" "" { target *-*-* } 0 } +// Expect the compiler builtin to do the completeness check. +// { dg-error "incomplete type" "" { target *-*-* } 0 } #include diff --git a/libstdc++-v3/testsuite/20_util/is_empty/incomplete_neg.cc b/libstdc++-v3/testsuite/20_util/is_empty/incomplete_neg.cc new file mode 100644 index 00000000000..3bacefbab7e --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_empty/incomplete_neg.cc @@ -0,0 +1,30 @@ +// { dg-do compile { target c++11 } } + +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// Expect the compiler builtin to do the completeness check. +// { dg-error "incomplete type" "" { target *-*-* } 0 } + +#include + +class X; + +void test01() +{ + std::is_empty(); // { dg-error "required from here" } +} diff --git a/libstdc++-v3/testsuite/20_util/is_final/incomplete_neg.cc b/libstdc++-v3/testsuite/20_util/is_final/incomplete_neg.cc new file mode 100644 index 00000000000..0727c090a83 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_final/incomplete_neg.cc @@ -0,0 +1,30 @@ +// { dg-do compile { target c++14 } } + +// Copyright (C) 2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// Expect the compiler builtin to do the completeness check. +// { dg-error "incomplete type" "" { target *-*-* } 0 } + +#include + +class X; + +void test01() +{ + std::is_final(); // { dg-error "required from here" } +} diff --git a/libstdc++-v3/testsuite/20_util/is_polymorphic/incomplete_neg.cc b/libstdc++-v3/testsuite/20_util/is_polymorphic/incomplete_neg.cc index 8cd1b402a41..618c4fa7a9a 100644 --- a/libstdc++-v3/testsuite/20_util/is_polymorphic/incomplete_neg.cc +++ b/libstdc++-v3/testsuite/20_util/is_polymorphic/incomplete_neg.cc @@ -1,7 +1,5 @@ // { dg-do compile { target c++11 } } -// { dg-prune-output "invalid use of incomplete type" } -// { dg-prune-output "must be a complete" } -// + // Copyright (C) 2019 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -19,6 +17,9 @@ // with this library; see the file COPYING3. If not see // . +// Expect the compiler builtin to do the completeness check. +// { dg-error "incomplete type" "" { target *-*-* } 0 } + #include class X;