re PR c++/55032 (Internal compiler error: in strip_typedefs, at cp/tree.c:1199)

PR c++/55032
	* tree.c (build_array_type_1): Re-layout if we found it in the
	hash table.

From-SVN: r194268
This commit is contained in:
Jason Merrill 2012-12-06 15:21:29 -05:00 committed by Jason Merrill
parent 231e16c64d
commit 4c4b757fcc
3 changed files with 33 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2012-12-06 Jason Merrill <jason@redhat.com>
PR c++/55032
* tree.c (build_array_type_1): Re-layout if we found it in the
hash table.
2012-12-05 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* config/pa/pa.md: Use "const_int 0" instead of match_test to simplify

View File

@ -0,0 +1,22 @@
// PR c++/55032
template<typename T>
struct vec3t {
T c[3];
};
typedef vec3t<float> vec3;
class Bounds {
public:
Bounds(const vec3 bb[2]);
void foo(const vec3 & v) { v.c[0]; }
};
template<typename T>
void work(T& value);
void foo() {
vec3 bb[2];
work(bb);
}

View File

@ -7412,7 +7412,12 @@ build_array_type_1 (tree elt_type, tree index_type, bool shared)
hashval_t hashcode = iterative_hash_object (TYPE_HASH (elt_type), 0);
if (index_type)
hashcode = iterative_hash_object (TYPE_HASH (index_type), hashcode);
tree old_t = t;
t = type_hash_canon (hashcode, t);
if (t != old_t)
/* Lay it out again in case the element type has been completed since
the array was added to the hash table. */
layout_type (t);
}
if (TYPE_CANONICAL (t) == t)