From 174c7ba43b89a22b16e4244677c46b7ea66fa69f Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 29 Dec 2009 03:33:24 +0000 Subject: [PATCH] PR c++/42447 * pt.c (iterative_hash_template_arg): Don't rely on TYPE_CANONICAL for ARRAY_TYPE. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155499 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++ gcc/cp/pt.c | 7 +++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/template/array21.C | 50 +++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/array21.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 57a4643..c39304c 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 85ad539..d5342a1 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 aef38ad..179b08c 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 0000000..5c5f2f6 --- /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); } -- 2.7.4