c++: Fix qualified array-type construction [PR 98538]

This was an assert that was too picky.  The reason I had to alter
array construction was that on stream in, we cannot dynamically determine
a type's dependentness.  Thus on stream out of the 'problematic' types,
we save the dependentness for reconstruction.  Fortunately the paths into
cp_build_qualified_type_real from streamin with arrays do have the array's
dependentess set as needed.

	PR c++/98538
	gcc/cp/
	* tree.c (cp_build_qualified_type_real): Propagate an array's
	dependentness to the copy, if known.
	gcc/testsuite/
	* g++.dg/template/pr98538.C: New.
This commit is contained in:
Nathan Sidwell 2021-01-15 11:38:43 -08:00
parent e1efa6af61
commit 9beb6d88ef
2 changed files with 23 additions and 3 deletions

View File

@ -1340,10 +1340,12 @@ cp_build_qualified_type_real (tree type,
if (!t)
{
gcc_checking_assert (TYPE_DEPENDENT_P_VALID (type)
|| !dependent_type_p (type));
/* If we already know the dependentness, tell the array type
constructor. This is important for module streaming, as we cannot
dynamically determine that on read in. */
t = build_cplus_array_type (element_type, TYPE_DOMAIN (type),
TYPE_DEPENDENT_P (type));
TYPE_DEPENDENT_P_VALID (type)
? int (TYPE_DEPENDENT_P (type)) : -1);
/* Keep the typedef name. */
if (TYPE_NAME (t) != TYPE_NAME (type))

View File

@ -0,0 +1,18 @@
// PR c++/98538
// { dg-do compile { target c++11 } }
// ICE bulding a dependent array type variant
template<typename T> using A = int[1];
template<typename T, const A<T>> struct X { };
template<typename T>
void
f (const A<T>)
{
const A<T> a;
}
template<typename T>
struct Y {
const A<T> a;
};