diff options
author | Jason Merrill <jason@redhat.com> | 2010-10-27 17:43:33 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2010-10-27 17:43:33 -0400 |
commit | 2b08f2c561e0dc9b8f569a00868a6b7eb2ba111b (patch) | |
tree | f2bb18bbab464000b24772c45a3ad35f319b284b /gcc | |
parent | 81f0bab25ec7d17b84e94ee7322aa953a75584a7 (diff) | |
download | gcc-2b08f2c561e0dc9b8f569a00868a6b7eb2ba111b.zip gcc-2b08f2c561e0dc9b8f569a00868a6b7eb2ba111b.tar.gz gcc-2b08f2c561e0dc9b8f569a00868a6b7eb2ba111b.tar.bz2 |
c-common.c (c_common_reswords): Add __is_literal_type.
gcc/c-family/
* c-common.c (c_common_reswords): Add __is_literal_type.
* c-common.h (enum rid): Add RID_IS_LITERAL_TYPE.
gcc/cp/
* cp-tree.h (cp_trait_kind): Add CPTK_IS_LITERAL_TYPE.
* cxx-pretty-print.c (pp_cxx_trait_expression): Handle it.
* semantics.c (trait_expr_value, finish_trait_expr): Likewise.
* parser.c (cp_parser_primary_expression): Handle RID_IS_LITERAL_TYPE.
(cp_parser_trait_expr): Likewise.
libstdc++-v3/
* include/std/type_traits (is_literal_type): New.
From-SVN: r166020
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/c-family/c-common.c | 1 | ||||
-rw-r--r-- | gcc/c-family/c-common.h | 2 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/cxx-pretty-print.c | 3 | ||||
-rw-r--r-- | gcc/cp/parser.c | 4 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C | 38 |
10 files changed, 68 insertions, 1 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 1098129e..4c18990 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,5 +1,8 @@ 2010-10-27 Jason Merrill <jason@redhat.com> + * c-common.c (c_common_reswords): Add __is_literal_type. + * c-common.h (enum rid): Add RID_IS_LITERAL_TYPE. + * c-common.c (check_case_value): Remove special C++ code. 2010-10-27 Nicola Pero <nicola.pero@meta-innovation.com> diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 98568e8..3cdc663 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -439,6 +439,7 @@ const struct c_common_resword c_common_reswords[] = { "__is_standard_layout", RID_IS_STD_LAYOUT, D_CXXONLY }, { "__is_trivial", RID_IS_TRIVIAL, D_CXXONLY }, { "__is_union", RID_IS_UNION, D_CXXONLY }, + { "__is_literal_type", RID_IS_LITERAL_TYPE, D_CXXONLY }, { "__imag", RID_IMAGPART, 0 }, { "__imag__", RID_IMAGPART, 0 }, { "__inline", RID_INLINE, 0 }, diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index aa877d4..f2c6958 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -140,7 +140,7 @@ enum rid RID_IS_EMPTY, RID_IS_ENUM, RID_IS_POD, RID_IS_POLYMORPHIC, RID_IS_STD_LAYOUT, RID_IS_TRIVIAL, - RID_IS_UNION, + RID_IS_UNION, RID_IS_LITERAL_TYPE, /* C++0x */ RID_CONSTEXPR, RID_DECLTYPE, RID_NOEXCEPT, RID_NULLPTR, RID_STATIC_ASSERT, diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6efa96a..8a94ad0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2010-10-27 Jason Merrill <jason@redhat.com> + + * cp-tree.h (cp_trait_kind): Add CPTK_IS_LITERAL_TYPE. + * cxx-pretty-print.c (pp_cxx_trait_expression): Handle it. + * semantics.c (trait_expr_value, finish_trait_expr): Likewise. + * parser.c (cp_parser_primary_expression): Handle RID_IS_LITERAL_TYPE. + (cp_parser_trait_expr): Likewise. + 2010-10-27 Gabriel Dos Reis <gdr@cse.tamu.edu> Jason Merrill <jason@redhat.com> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 1cd776a..7595b6f 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -567,6 +567,7 @@ typedef enum cp_trait_kind CPTK_IS_POLYMORPHIC, CPTK_IS_STD_LAYOUT, CPTK_IS_TRIVIAL, + CPTK_IS_LITERAL_TYPE, CPTK_IS_UNION } cp_trait_kind; diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c index bbef227..09fcc49 100644 --- a/gcc/cp/cxx-pretty-print.c +++ b/gcc/cp/cxx-pretty-print.c @@ -2369,6 +2369,9 @@ pp_cxx_trait_expression (cxx_pretty_printer *pp, tree t) case CPTK_IS_UNION: pp_cxx_ws_string (pp, "__is_union"); break; + case CPTK_IS_LITERAL_TYPE: + pp_cxx_ws_string (pp, "__is_literal_type"); + break; default: gcc_unreachable (); diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 0d28345..360e197 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -3814,6 +3814,7 @@ cp_parser_primary_expression (cp_parser *parser, case RID_IS_STD_LAYOUT: case RID_IS_TRIVIAL: case RID_IS_UNION: + case RID_IS_LITERAL_TYPE: return cp_parser_trait_expr (parser, token->keyword); /* Objective-C++ expressions. */ @@ -7365,6 +7366,9 @@ cp_parser_trait_expr (cp_parser* parser, enum rid keyword) case RID_IS_UNION: kind = CPTK_IS_UNION; break; + case RID_IS_LITERAL_TYPE: + kind = CPTK_IS_LITERAL_TYPE; + break; default: gcc_unreachable (); } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 0ca8c339..5926963 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -5104,6 +5104,9 @@ trait_expr_value (cp_trait_kind kind, tree type1, tree type2) case CPTK_IS_UNION: return (type_code1 == UNION_TYPE); + case CPTK_IS_LITERAL_TYPE: + return (literal_type_p (type1)); + default: gcc_unreachable (); return false; @@ -5152,6 +5155,7 @@ finish_trait_expr (cp_trait_kind kind, tree type1, tree type2) || kind == CPTK_IS_POLYMORPHIC || kind == CPTK_IS_STD_LAYOUT || kind == CPTK_IS_TRIVIAL + || kind == CPTK_IS_LITERAL_TYPE || kind == CPTK_IS_UNION); if (kind == CPTK_IS_CONVERTIBLE_TO) @@ -5195,6 +5199,7 @@ finish_trait_expr (cp_trait_kind kind, tree type1, tree type2) case CPTK_IS_POLYMORPHIC: case CPTK_IS_STD_LAYOUT: case CPTK_IS_TRIVIAL: + case CPTK_IS_LITERAL_TYPE: if (!check_trait_type (type1)) { error ("incomplete type %qT not allowed", type1); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a749c49..a4811f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-10-27 Jason Merrill <jason@redhat.com> + + * g++.dg/cpp0x/constexpr-is_literal.C: New. + 2010-10-27 Janus Weil <janus@gcc.gnu.org> PR fortran/46161 diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C new file mode 100644 index 0000000..d1b9543 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C @@ -0,0 +1,38 @@ +// { dg-options -std=c++0x } + +#include <type_traits> + +#define IS_LIT(T) (std::is_literal_type<T>::value) +#define SA(X) static_assert (X, #X) +#define YES(T) SA(IS_LIT(T)) +#define NO(T) SA(!IS_LIT(T)) + +enum E1 { }; +enum class E2 { }; +struct Literal {}; + +struct NotLiteral { + ~NotLiteral(); +}; + +YES(int); +YES(int[]); +YES(int[3]); +YES(double); +YES(void *); +YES(decltype (nullptr)); +YES(int Literal::*); +YES(void (Literal::*)()); +YES(E1); +YES(E2); +YES(Literal); +NO (NotLiteral); +YES(NotLiteral *); +YES(NotLiteral NotLiteral::*); +YES(NotLiteral (NotLiteral::*)(NotLiteral)); + +struct A { + A(const A&) = default; +}; + +NO(A); // no constexpr ctor other than copy |