summaryrefslogtreecommitdiff
path: root/gcc/cp/tree.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-12-04 08:34:41 -0800
committerNathan Sidwell <nathan@acm.org>2020-12-04 08:38:57 -0800
commit5a26d4a204c8a462a7e0a1a86bb2f25ecd470aad (patch)
tree3053f43703cd570003a0a08af1d2b3fc50fa4e62 /gcc/cp/tree.c
parent97eaf8c92f9caaa888475f98cc7a55a05672c87b (diff)
downloadgcc-5a26d4a204c8a462a7e0a1a86bb2f25ecd470aad.tar.gz
c++: Revert dependent-array changes [PR 98116]
The changes reverted here are exposing an existing problem with alias template comparisons. The typename_type changes are also incomplete, possibly for similar reasons. It seems safer to revert them, fix the underlying issue and then move forwards. The testcases is adjusted to more robustly check the specialization table, and ICEs with and without the c++ changes. Revert: 62fb1b9e0da c++: Fix array type dependency [PR 98107] 07589ca2b2c c++: typename_type structural comparison 29ae1d7751 c++: Extend build_array_type API PR c++/98116 gcc/cp/ * cp-tree.h (comparing_typenames): Delete. (cplus_build_array_type): Remove default parm. * pt.c (comparing_typenames): Delete. (spec_hasher::equal): Don't increment it. * tree.c (set_array_type_canon): Remove dep parm. (build_cplus_array_type): Remove dep parm changes. (cp_build_qualified_type_real): Remove dependent array type changes. (strip_typedefs): Likewise. * typeck.c (structural_comptypes): Revert comparing_typename changes. gcc/testsuite/ * g++.dg/template/pr98116.C: Enable robust checking.
Diffstat (limited to 'gcc/cp/tree.c')
-rw-r--r--gcc/cp/tree.c40
1 files changed, 11 insertions, 29 deletions
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index d9fa505041f..4e6bf9abba6 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -998,7 +998,7 @@ build_min_array_type (tree elt_type, tree index_type)
build_cplus_array_type. */
static void
-set_array_type_canon (tree t, tree elt_type, tree index_type, bool dep)
+set_array_type_canon (tree t, tree elt_type, tree index_type)
{
/* Set the canonical type for this new node. */
if (TYPE_STRUCTURAL_EQUALITY_P (elt_type)
@@ -1009,33 +1009,30 @@ set_array_type_canon (tree t, tree elt_type, tree index_type, bool dep)
TYPE_CANONICAL (t)
= build_cplus_array_type (TYPE_CANONICAL (elt_type),
index_type
- ? TYPE_CANONICAL (index_type) : index_type,
- dep);
+ ? TYPE_CANONICAL (index_type) : index_type);
else
TYPE_CANONICAL (t) = t;
}
/* Like build_array_type, but handle special C++ semantics: an array of a
variant element type is a variant of the array of the main variant of
- the element type. IS_DEPENDENT is -ve if we should determine the
- dependency. Otherwise its bool value indicates dependency. */
+ the element type. */
tree
-build_cplus_array_type (tree elt_type, tree index_type, int dependent)
+build_cplus_array_type (tree elt_type, tree index_type)
{
tree t;
if (elt_type == error_mark_node || index_type == error_mark_node)
return error_mark_node;
- if (dependent < 0)
- dependent = (uses_template_parms (elt_type)
- || (index_type && uses_template_parms (index_type)));
+ bool dependent = (uses_template_parms (elt_type)
+ || (index_type && uses_template_parms (index_type)));
if (elt_type != TYPE_MAIN_VARIANT (elt_type))
/* Start with an array of the TYPE_MAIN_VARIANT. */
t = build_cplus_array_type (TYPE_MAIN_VARIANT (elt_type),
- index_type, dependent);
+ index_type);
else if (dependent)
{
/* Since type_hash_canon calls layout_type, we need to use our own
@@ -1065,20 +1062,13 @@ build_cplus_array_type (tree elt_type, tree index_type, int dependent)
*e = t;
/* Set the canonical type for this new node. */
- set_array_type_canon (t, elt_type, index_type, dependent);
-
- /* Mark it as dependent now, this saves time later. */
- TYPE_DEPENDENT_P_VALID (t) = true;
- TYPE_DEPENDENT_P (t) = true;
+ set_array_type_canon (t, elt_type, index_type);
}
}
else
{
bool typeless_storage = is_byte_access_type (elt_type);
t = build_array_type (elt_type, index_type, typeless_storage);
-
- /* Mark as non-dependenty now, this will save time later. */
- TYPE_DEPENDENT_P_VALID (t) = true;
}
/* Now check whether we already have this array variant. */
@@ -1093,10 +1083,7 @@ build_cplus_array_type (tree elt_type, tree index_type, int dependent)
if (!t)
{
t = build_min_array_type (elt_type, index_type);
- /* Mark dependency now, this saves time later. */
- TYPE_DEPENDENT_P_VALID (t) = true;
- TYPE_DEPENDENT_P (t) = dependent;
- set_array_type_canon (t, elt_type, index_type, dependent);
+ set_array_type_canon (t, elt_type, index_type);
if (!dependent)
{
layout_type (t);
@@ -1332,10 +1319,7 @@ cp_build_qualified_type_real (tree type,
if (!t)
{
- gcc_checking_assert (TYPE_DEPENDENT_P_VALID (type)
- || !dependent_type_p (type));
- t = build_cplus_array_type (element_type, TYPE_DOMAIN (type),
- TYPE_DEPENDENT_P (type));
+ t = build_cplus_array_type (element_type, TYPE_DOMAIN (type));
/* Keep the typedef name. */
if (TYPE_NAME (t) != TYPE_NAME (type))
@@ -1571,9 +1555,7 @@ strip_typedefs (tree t, bool *remove_attributes, unsigned int flags)
case ARRAY_TYPE:
type = strip_typedefs (TREE_TYPE (t), remove_attributes, flags);
t0 = strip_typedefs (TYPE_DOMAIN (t), remove_attributes, flags);
- gcc_checking_assert (TYPE_DEPENDENT_P_VALID (t)
- || !dependent_type_p (t));
- result = build_cplus_array_type (type, t0, TYPE_DEPENDENT_P (t));
+ result = build_cplus_array_type (type, t0);
break;
case FUNCTION_TYPE:
case METHOD_TYPE: