aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/module.cc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2022-09-29 09:18:11 -0400
committerPatrick Palka <ppalka@redhat.com>2022-09-29 09:18:11 -0400
commit817e878a31671fcb68492bce35aa1ac87e08efdb (patch)
tree12b20c83ddd71f33a87747f21776d27673da7295 /gcc/cp/module.cc
parentdf7f2736509cfe5e1dd7d9f263355c5043347a9c (diff)
downloadgcc-817e878a31671fcb68492bce35aa1ac87e08efdb.zip
gcc-817e878a31671fcb68492bce35aa1ac87e08efdb.tar.gz
gcc-817e878a31671fcb68492bce35aa1ac87e08efdb.tar.bz2
c++: introduce TRAIT_TYPE alongside TRAIT_EXPR
We already have generic support for predicate-like traits that yield a boolean value via TRAIT_EXPR, but we lack the same support for traits that yield a type instead of a value. Such support would streamline implementing efficient builtins for the standard library type traits. To that end this patch implements a generic TRAIT_TYPE type alongside TRAIT_EXPR, and reimplements the existing UNDERLYING_TYPE builtin trait using this new TRAIT_TYPE. gcc/cp/ChangeLog: * cp-objcp-common.cc (cp_common_init_ts): Replace UNDERLYING_TYPE with TRAIT_TYPE. * cp-tree.def (TRAIT_TYPE): Define. (UNDERLYING_TYPE): Remove. * cp-tree.h (TRAIT_TYPE_KIND_RAW): Define. (TRAIT_TYPE_KIND): Define. (TRAIT_TYPE_TYPE1): Define. (TRAIT_TYPE_TYPE2): Define. (WILDCARD_TYPE_P): Return true for TRAIT_TYPE. (finish_trait_type): Declare. * cxx-pretty-print.cc (cxx_pretty_printer::primary_expression): Adjust after renaming pp_cxx_trait_expression. (cxx_pretty_printer::simple_type_specifier) <case TRAIT_TYPE>: New. (cxx_pretty_printer::type_id): Replace UNDERLYING_TYPE with TRAIT_TYPE. (pp_cxx_trait_expression): Rename to ... (pp_cxx_trait): ... this. Handle TRAIT_TYPE as well. Correct pretty printing of the trailing arguments. * cxx-pretty-print.h (pp_cxx_trait_expression): Rename to ... (pp_cxx_trait_type): ... this. * error.cc (dump_type) <case UNDERLYING_TYPE>: Remove. <case TRAIT_TYPE>: New. (dump_type_prefix): Replace UNDERLYING_WITH with TRAIT_TYPE. (dump_type_suffix): Likewise. * mangle.cc (write_type) <case UNDERLYING_TYPE>: Remove. <case TRAIT_TYPE>: New. * module.cc (trees_out::type_node) <case UNDERLYING_TYPE>: Remove. <case TRAIT_TYPE>: New. (trees_in::tree_node): Likewise. * parser.cc (cp_parser_primary_expression): Adjust after renaming cp_parser_trait_expr. (cp_parser_trait_expr): Rename to ... (cp_parser_trait): ... this. Call finish_trait_type for traits that yield a type. (cp_parser_simple_type_specifier): Adjust after renaming cp_parser_trait_expr. * pt.cc (for_each_template_parm_r) <case UNDERLYING_TYPE>: Remove. <case TRAIT_TYPE>: New. (tsubst): Likewise. (unify): Replace UNDERLYING_TYPE with TRAIT_TYPE. (dependent_type_p_r): Likewise. * semantics.cc (finish_underlying_type): Don't return UNDERLYING_TYPE anymore when processing_template_decl. (finish_trait_type): Define. * tree.cc (strip_typedefs) <case UNDERLYING_TYPE>: Remove. <case TRAIT_TYPE>: New. (cp_walk_subtrees): Likewise. * typeck.cc (structural_comptypes): Likewise. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/alias-decl-59.C: Adjust expected error message. * g++.dg/ext/underlying_type7.C: Likewise. * g++.dg/ext/underlying_type13.C: New test. * g++.dg/ext/underlying_type14.C: New test.
Diffstat (limited to 'gcc/cp/module.cc')
-rw-r--r--gcc/cp/module.cc24
1 files changed, 22 insertions, 2 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index cbf3a77..500ac06 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -8926,7 +8926,6 @@ trees_out::type_node (tree type)
case DECLTYPE_TYPE:
case TYPEOF_TYPE:
- case UNDERLYING_TYPE:
case DEPENDENT_OPERATOR_TYPE:
tree_node (TYPE_VALUES_RAW (type));
if (TREE_CODE (type) == DECLTYPE_TYPE)
@@ -8936,6 +8935,12 @@ trees_out::type_node (tree type)
tree_node_bools (type);
break;
+ case TRAIT_TYPE:
+ tree_node (TRAIT_TYPE_KIND_RAW (type));
+ tree_node (TRAIT_TYPE_TYPE1 (type));
+ tree_node (TRAIT_TYPE_TYPE2 (type));
+ break;
+
case TYPE_ARGUMENT_PACK:
/* No additional data. */
break;
@@ -9450,7 +9455,6 @@ trees_in::tree_node (bool is_use)
case DECLTYPE_TYPE:
case TYPEOF_TYPE:
- case UNDERLYING_TYPE:
case DEPENDENT_OPERATOR_TYPE:
{
tree expr = tree_node ();
@@ -9465,6 +9469,22 @@ trees_in::tree_node (bool is_use)
}
break;
+ case TRAIT_TYPE:
+ {
+ tree kind = tree_node ();
+ tree type1 = tree_node ();
+ tree type2 = tree_node ();
+ if (!get_overrun ())
+ {
+ res = cxx_make_type (TRAIT_TYPE);
+ TRAIT_TYPE_KIND_RAW (res) = kind;
+ TRAIT_TYPE_TYPE1 (res) = type1;
+ TRAIT_TYPE_TYPE2 (res) = type2;
+ SET_TYPE_STRUCTURAL_EQUALITY (res);
+ }
+ }
+ break;
+
case TYPE_ARGUMENT_PACK:
if (!get_overrun ())
{