diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-12-03 07:42:09 -0800 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-12-03 07:56:23 -0800 |
commit | 62fb1b9e0da44a15b0434def20724f989d61e27b (patch) | |
tree | a5fc3e51c9a2d09efcfa3d28b073b595d8df8e7f | |
parent | 9c6813437611a877eaffc255a0a1a2cbffa6466d (diff) | |
download | gcc-62fb1b9e0da44a15b0434def20724f989d61e27b.zip gcc-62fb1b9e0da44a15b0434def20724f989d61e27b.tar.gz gcc-62fb1b9e0da44a15b0434def20724f989d61e27b.tar.bz2 |
c++: Fix array type dependency [PR 98107]
I'd missed some paths through build_cplus_array_type, plus, some
arrays come via the C-type builder. This propagates dependency in
more places and asserts that in the cases where TYPE_DEPENDENT_P_VALID
is unset, the type is non-dependent.
PR c++/98107
gcc/cp/
* tree.c (build_cplus_array_type): Mark dependency of new variant.
(cp_build_qualified_type_real, strip_typedefs): Assert
TYPE_DEPENDENT_P_VALID, or not a dependent type.
-rw-r--r-- | gcc/cp/tree.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 2d97c86..8d7df60 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1076,6 +1076,9 @@ build_cplus_array_type (tree elt_type, tree index_type, int dependent) { 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. */ @@ -1090,6 +1093,9 @@ 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); if (!dependent) { @@ -1326,6 +1332,8 @@ 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)); @@ -1563,6 +1571,8 @@ 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)); break; case FUNCTION_TYPE: |