diff options
author | Jason Merrill <jason@redhat.com> | 2009-07-16 16:36:10 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2009-07-16 16:36:10 -0400 |
commit | c32097d8b4fb21997c571cf6520431fa7d06090f (patch) | |
tree | 100c59a1743caa8ea59faa87406fd5f529be94f4 /libstdc++-v3 | |
parent | b3c5a40978985447d8ccf7d583929a4e8a78a91d (diff) | |
download | gcc-c32097d8b4fb21997c571cf6520431fa7d06090f.zip gcc-c32097d8b4fb21997c571cf6520431fa7d06090f.tar.gz gcc-c32097d8b4fb21997c571cf6520431fa7d06090f.tar.bz2 |
re PR libstdc++/37907 ([c++0x] support for std::is_standard_layout)
PR libstdc++/37907
Support std::is_standard_layout and std::is_trivial traits,
change POD to C++0x version (except for layout).
* gcc/c-common.c (c_common_reswords): Add __is_standard_layout
and __is_trivial.
* gcc/c-common.h (enum rid): Add RID_IS_STD_LAYOUT and RID_IS_TRIVIAL.
* gcc/cp/cp-tree.h (enum cp_trait_kind): Add CPTK_IS_STD_LAYOUT,
CPTK_IS_TRIVIAL.
(struct lang_type_class): Add non_std_layout.
(CLASSTYPE_NON_STD_LAYOUT): New.
* gcc/cp/class.c (check_bases): Set it.
(check_field_decls): Likewise.
(check_bases_and_members): Likewise.
* gcc/cp/parser.c (cp_parser_primary_expression): Handle RID_IS_STD_LAYOUT,
RID_IS_TRIVIAL.
(cp_parser_trait_expr): Likewise.
* gcc/cp/semantics.c (trait_expr_value): Handle CPTK_IS_STD_LAYOUT,
CPTK_IS_TRIVIAL.
(finish_trait_expr): Likewise.
* gcc/cp/tree.c (scalarish_type_p, trivial_type_p, std_layout_type_p): New.
(pod_type_p): Use them.
* gcc/cp/typeck.c (build_class_member_access_expr): Check
CLASSTYPE_NON_STD_LAYOUT rather than CLASSTYPE_NON_POD_P.
* libstdc++-v3/include/std/type_traits: Add is_standard_layout, is_trivial.
From-SVN: r149721
Diffstat (limited to 'libstdc++-v3')
4 files changed, 25 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 39b9749..60c1c3f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2009-07-16 Jason Merrill <jason@redhat.com> + + PR libstdc++/37907 + * include/std/type_traits: Add is_standard_layout, is_trivial. + * testsuite/20_util/make_signed/requirements/typedefs_neg.cc, + testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc: + Update line numbers. + 2009-07-16 Phil Muldoon <pmuldoon@redhat.com> Tom Tromey <tromey@redhat.com> diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 94c40df..dd26bb8 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -173,11 +173,18 @@ namespace std // Member introspection. /// is_pod + // Could use is_standard_layout && is_trivial instead of the builtin. template<typename _Tp> struct is_pod : public integral_constant<bool, __is_pod(_Tp)> { }; + /// is_standard_layout + template<typename _Tp> + struct is_standard_layout + : public integral_constant<bool, __is_standard_layout(_Tp)> + { }; + /// has_trivial_default_constructor template<typename _Tp> struct has_trivial_default_constructor @@ -202,6 +209,12 @@ namespace std : public integral_constant<bool, __has_trivial_destructor(_Tp)> { }; + /// is_trivial + template<typename _Tp> + struct is_trivial + : public integral_constant<bool, __is_trivial(_Tp)> + { }; + /// has_nothrow_default_constructor template<typename _Tp> struct has_nothrow_default_constructor 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 ca7ee97..3455462 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 @@ -48,8 +48,8 @@ void test01() // { dg-error "instantiated from here" "" { target *-*-* } 40 } // { dg-error "instantiated from here" "" { target *-*-* } 42 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 557 } -// { dg-error "declaration of" "" { target *-*-* } 519 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 570 } +// { dg-error "declaration of" "" { target *-*-* } 532 } // { dg-excess-errors "At global scope" } // { dg-excess-errors "In instantiation of" } 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 ac9fef1..3d3a10a 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 @@ -48,8 +48,8 @@ void test01() // { dg-error "instantiated from here" "" { target *-*-* } 40 } // { dg-error "instantiated from here" "" { target *-*-* } 42 } -// { dg-error "invalid use of incomplete type" "" { target *-*-* } 478 } -// { dg-error "declaration of" "" { target *-*-* } 440 } +// { dg-error "invalid use of incomplete type" "" { target *-*-* } 491 } +// { dg-error "declaration of" "" { target *-*-* } 453 } // { dg-excess-errors "At global scope" } // { dg-excess-errors "In instantiation of" } |