From: Richard Guenther Date: Sun, 6 Sep 2009 16:49:48 +0000 (+0000) Subject: re PR c++/41144 (ice for legal code with -O2 in get_alias_set) X-Git-Tag: releases/gcc-4.5.0~3655 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3797a0ff2f3da43cef2c13b2b3fad2695cd7cf02;p=thirdparty%2Fgcc.git re PR c++/41144 (ice for legal code with -O2 in get_alias_set) 2009-09-06 Richard Guenther PR middle-end/41144 * tree.c (build_array_type): Do not record types marked with structural equality in the canonical type hashtable. * g++.dg/torture/pr41144.C: New testcase. From-SVN: r151461 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 80be0453ef36..76d93f60fd72 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-09-06 Richard Guenther + + PR middle-end/41144 + * tree.c (build_array_type): Do not record types marked + with structural equality in the canonical type hashtable. + 2009-09-06 Richard Guenther PR middle-end/41261 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4712bc5e9b50..b14aaf087bd8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-09-06 Richard Guenther + + PR middle-end/41144 + * g++.dg/torture/pr41144.C: New testcase. + 2009-09-06 Richard Guenther PR middle-end/41261 diff --git a/gcc/testsuite/g++.dg/torture/pr41144.C b/gcc/testsuite/g++.dg/torture/pr41144.C new file mode 100644 index 000000000000..64dc117d7c69 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr41144.C @@ -0,0 +1,23 @@ +/* { dg-do compile } */ + +struct rgba8; +template class span_gouraud { +public: + struct coord_type { }; + coord_type m_coord[3]; +}; +template class span_gouraud_rgba : public span_gouraud +{ + typedef ColorT color_type; + typedef span_gouraud base_type; + typedef typename base_type::coord_type coord_type; +public: + void prepare() { + coord_type coord[3]; + } +}; +void the_application() { + typedef span_gouraud_rgba gouraud_span_gen_type; + gouraud_span_gen_type span_gouraud; + span_gouraud.prepare(); +} diff --git a/gcc/tree.c b/gcc/tree.c index 1db7d0a86c33..a036439cc3f7 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -6906,44 +6906,29 @@ build_array_type (tree elt_type, tree index_type) t = make_node (ARRAY_TYPE); TREE_TYPE (t) = elt_type; TYPE_DOMAIN (t) = index_type; - - if (index_type == 0) - { - tree save = t; - hashcode = iterative_hash_object (TYPE_HASH (elt_type), hashcode); - t = type_hash_canon (hashcode, t); - if (save == t) - layout_type (t); - - if (TYPE_CANONICAL (t) == t) - { - if (TYPE_STRUCTURAL_EQUALITY_P (elt_type)) - SET_TYPE_STRUCTURAL_EQUALITY (t); - else if (TYPE_CANONICAL (elt_type) != elt_type) - TYPE_CANONICAL (t) - = build_array_type (TYPE_CANONICAL (elt_type), index_type); - } + layout_type (t); - return t; - } + /* If the element type is incomplete at this point we get marked for + structural equality. Do not record these types in the canonical + type hashtable. */ + if (TYPE_STRUCTURAL_EQUALITY_P (t)) + return t; hashcode = iterative_hash_object (TYPE_HASH (elt_type), hashcode); - hashcode = iterative_hash_object (TYPE_HASH (index_type), hashcode); + if (index_type) + hashcode = iterative_hash_object (TYPE_HASH (index_type), hashcode); t = type_hash_canon (hashcode, t); - if (!COMPLETE_TYPE_P (t)) - layout_type (t); - if (TYPE_CANONICAL (t) == t) { if (TYPE_STRUCTURAL_EQUALITY_P (elt_type) - || TYPE_STRUCTURAL_EQUALITY_P (index_type)) + || (index_type && TYPE_STRUCTURAL_EQUALITY_P (index_type))) SET_TYPE_STRUCTURAL_EQUALITY (t); else if (TYPE_CANONICAL (elt_type) != elt_type - || TYPE_CANONICAL (index_type) != index_type) + || (index_type && TYPE_CANONICAL (index_type) != index_type)) TYPE_CANONICAL (t) = build_array_type (TYPE_CANONICAL (elt_type), - TYPE_CANONICAL (index_type)); + index_type ? TYPE_CANONICAL (index_type) : NULL); } return t;