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.
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))
--- /dev/null
+// 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;
+};