mirror of git://gcc.gnu.org/git/gcc.git
re PR c++/35113 (g++.dg/ext/vector13.C doesn't work)
2008-02-11 Douglas Gregor <doug.gregor@gmail.com>
PR c++/35113
* tree.c (cp_build_qualified_type_real): When building a
cv-qualified array type, build it as a unique type with
build_cplus_array_type_1 and then adopt the unqualified type's
main variant.
From-SVN: r132242
This commit is contained in:
parent
5fd38b882f
commit
37d24376c4
|
|
@ -1,3 +1,11 @@
|
||||||
|
2008-02-11 Douglas Gregor <doug.gregor@gmail.com>
|
||||||
|
|
||||||
|
PR c++/35113
|
||||||
|
* tree.c (cp_build_qualified_type_real): When building a
|
||||||
|
cv-qualified array type, build it as a unique type with
|
||||||
|
build_cplus_array_type_1 and then adopt the unqualified type's
|
||||||
|
main variant.
|
||||||
|
|
||||||
2008-02-11 Paolo Carlini <pcarlini@suse.de>
|
2008-02-11 Paolo Carlini <pcarlini@suse.de>
|
||||||
|
|
||||||
PR c++/35077
|
PR c++/35077
|
||||||
|
|
|
||||||
|
|
@ -727,45 +727,31 @@ cp_build_qualified_type_real (tree type,
|
||||||
|
|
||||||
if (!t)
|
if (!t)
|
||||||
{
|
{
|
||||||
tree index_type = TYPE_DOMAIN (type);
|
t = build_cplus_array_type_1 (element_type, TYPE_DOMAIN (type));
|
||||||
void **e;
|
|
||||||
cplus_array_info cai;
|
|
||||||
hashval_t hash;
|
|
||||||
|
|
||||||
if (cplus_array_htab == NULL)
|
if (TYPE_MAIN_VARIANT (t) != TYPE_MAIN_VARIANT (type))
|
||||||
cplus_array_htab = htab_create_ggc (61, &cplus_array_hash,
|
{
|
||||||
&cplus_array_compare,
|
/* Set the main variant of the newly-created ARRAY_TYPE
|
||||||
NULL);
|
(with cv-qualified element type) to the main variant of
|
||||||
|
the unqualified ARRAY_TYPE we started with. */
|
||||||
|
tree last_variant = t;
|
||||||
|
tree m = TYPE_MAIN_VARIANT (type);
|
||||||
|
|
||||||
hash = (htab_hash_pointer (element_type)
|
/* Find the last variant on the new ARRAY_TYPEs list of
|
||||||
^ htab_hash_pointer (index_type));
|
variants, setting the main variant of each of the other
|
||||||
cai.type = element_type;
|
types to the main variant of our unqualified
|
||||||
cai.domain = index_type;
|
ARRAY_TYPE. */
|
||||||
|
while (TYPE_NEXT_VARIANT (last_variant))
|
||||||
|
{
|
||||||
|
TYPE_MAIN_VARIANT (last_variant) = m;
|
||||||
|
last_variant = TYPE_NEXT_VARIANT (last_variant);
|
||||||
|
}
|
||||||
|
|
||||||
e = htab_find_slot_with_hash (cplus_array_htab, &cai, hash, INSERT);
|
/* Splice in the newly-created variants. */
|
||||||
if (*e)
|
TYPE_NEXT_VARIANT (last_variant) = TYPE_NEXT_VARIANT (m);
|
||||||
/* We have found the type: we're done. */
|
TYPE_NEXT_VARIANT (m) = t;
|
||||||
return (tree) *e;
|
TYPE_MAIN_VARIANT (last_variant) = m;
|
||||||
|
}
|
||||||
/* Build a new array type and add it into the table. */
|
|
||||||
t = build_variant_type_copy (type);
|
|
||||||
TREE_TYPE (t) = element_type;
|
|
||||||
*e = t;
|
|
||||||
|
|
||||||
/* Set the canonical type for this new node. */
|
|
||||||
if (TYPE_STRUCTURAL_EQUALITY_P (element_type)
|
|
||||||
|| (index_type && TYPE_STRUCTURAL_EQUALITY_P (index_type)))
|
|
||||||
SET_TYPE_STRUCTURAL_EQUALITY (t);
|
|
||||||
else if (TYPE_CANONICAL (element_type) != element_type
|
|
||||||
|| (index_type
|
|
||||||
&& TYPE_CANONICAL (index_type) != index_type)
|
|
||||||
|| TYPE_CANONICAL (type) != type)
|
|
||||||
TYPE_CANONICAL (t)
|
|
||||||
= build_cplus_array_type
|
|
||||||
(TYPE_CANONICAL (element_type),
|
|
||||||
index_type? TYPE_CANONICAL (index_type) : index_type);
|
|
||||||
else
|
|
||||||
TYPE_CANONICAL (t) = t;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Even if we already had this variant, we update
|
/* Even if we already had this variant, we update
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue