From 9beb6d88effdab4209beb8bc5e4b8773317f1d33 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 15 Jan 2021 11:38:43 -0800 Subject: [PATCH] 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. --- gcc/cp/tree.c | 8 +++++--- gcc/testsuite/g++.dg/template/pr98538.C | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/pr98538.C diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 290e73bad83..7dcb453ba6a 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -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)) diff --git a/gcc/testsuite/g++.dg/template/pr98538.C b/gcc/testsuite/g++.dg/template/pr98538.C new file mode 100644 index 00000000000..b62e8a96af8 --- /dev/null +++ b/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 using A = int[1]; +template> struct X { }; + +template +void +f (const A) +{ + const A a; +} + +template +struct Y { + const A a; +}; -- 2.30.2