diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 57a464345c7..c39304c465b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-12-28 Jason Merrill + + PR c++/42447 + * pt.c (iterative_hash_template_arg): Don't rely on TYPE_CANONICAL + for ARRAY_TYPE. + 2009-12-24 Jason Merrill PR c++/41305, DR 384 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 85ad539f419..d5342a1653f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -1553,6 +1553,13 @@ iterative_hash_template_arg (tree arg, hashval_t val) val = iterative_hash_object (code, val); return iterative_hash_template_arg (TREE_OPERAND (arg, 2), val); + case ARRAY_TYPE: + /* layout_type sets structural equality for arrays of + incomplete type, so we can't rely on the canonical type + for hashing. */ + val = iterative_hash_template_arg (TREE_TYPE (arg), val); + return iterative_hash_template_arg (TYPE_DOMAIN (arg), val); + default: switch (tclass) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aef38ad70f5..179b08cb36b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-12-28 Jason Merrill + + PR c++/42447 + * g++.dg/template/array21.C: New. + 2009-12-28 Janus Weil PR fortran/42353 diff --git a/gcc/testsuite/g++.dg/template/array21.C b/gcc/testsuite/g++.dg/template/array21.C new file mode 100644 index 00000000000..5c5f2f65d6b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array21.C @@ -0,0 +1,50 @@ +// PR c++/42447 + +template + void* get(int); + +template + struct unique_ptr; + +template + struct unique_ptr<_Tp[]> + { + typedef int __tuple_type; + + void* + get() const + { return ::get<0>(_M_t); } + + __tuple_type _M_t; + }; + +template class dynamic_dispatch; + +template + struct dynamic_dispatch + { + struct entry { }; + unique_ptr m_Start; + + template + void attach_handler(void (UC::*m)(int&)) + { + entry* p = 0; + do { + } while(--p != m_Start.get()); + } + }; + +template + class request_dispatcher + : private dynamic_dispatch + { request_dispatcher(); }; + +struct file_reader +{ + void execute_command(int&); +}; + +template <> + request_dispatcher::request_dispatcher() + { this->attach_handler(&file_reader::execute_command); }