diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-12-04 08:34:41 -0800 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-12-04 08:38:57 -0800 |
commit | 5a26d4a204c8a462a7e0a1a86bb2f25ecd470aad (patch) | |
tree | 3053f43703cd570003a0a08af1d2b3fc50fa4e62 /gcc/cp/tree.c | |
parent | 97eaf8c92f9caaa888475f98cc7a55a05672c87b (diff) | |
download | gcc-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.c | 40 |
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: |