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:
parent
e1efa6af61
commit
9beb6d88ef
2 changed files with 23 additions and 3 deletions
|
@ -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))
|
||||
|
|
18
gcc/testsuite/g++.dg/template/pr98538.C
Normal file
18
gcc/testsuite/g++.dg/template/pr98538.C
Normal 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;
|
||||
};
|
Loading…
Add table
Reference in a new issue