diff mbox series

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

Message ID e2b0c556-4f91-ce68-36ba-7aa1d7b95072@acm.org
State New
Headers show
Series c++: Fix qualified array-type construction [PR 98538] | expand

Commit Message

Nathan Sidwell Jan. 15, 2021, 7:43 p.m. UTC
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.
diff mbox series

Patch

diff --git c/gcc/cp/tree.c w/gcc/cp/tree.c
index 3a9a86de34a..55325d7c671 100644
--- c/gcc/cp/tree.c
+++ w/gcc/cp/tree.c
@@ -1332,10 +1332,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))
diff --git c/gcc/testsuite/g++.dg/template/pr98538.C w/gcc/testsuite/g++.dg/template/pr98538.C
new file mode 100644
index 00000000000..b62e8a96af8
--- /dev/null
+++ w/gcc/testsuite/g++.dg/template/pr98538.C
@@ -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;
+};