re PR c++/42447 (ICE during processing complex templates)

PR c++/42447
	* pt.c (iterative_hash_template_arg): Don't rely on TYPE_CANONICAL
	for ARRAY_TYPE.

From-SVN: r155499
This commit is contained in:
Jason Merrill 2009-12-28 22:33:24 -05:00 committed by Jason Merrill
parent 2838468cc3
commit 4db98b6eb5
4 changed files with 68 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2009-12-28 Jason Merrill <jason@redhat.com>
PR c++/42447
* pt.c (iterative_hash_template_arg): Don't rely on TYPE_CANONICAL
for ARRAY_TYPE.
2009-12-24 Jason Merrill <jason@redhat.com>
PR c++/41305, DR 384

View file

@ -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)
{

View file

@ -1,3 +1,8 @@
2009-12-28 Jason Merrill <jason@redhat.com>
PR c++/42447
* g++.dg/template/array21.C: New.
2009-12-28 Janus Weil <janus@gcc.gnu.org>
PR fortran/42353

View file

@ -0,0 +1,50 @@
// PR c++/42447
template<int>
void* get(int);
template<typename>
struct unique_ptr;
template<typename _Tp>
struct unique_ptr<_Tp[]>
{
typedef int __tuple_type;
void*
get() const
{ return ::get<0>(_M_t); }
__tuple_type _M_t;
};
template <typename T> class dynamic_dispatch;
template <typename TC>
struct dynamic_dispatch<void (TC::*)(int&)>
{
struct entry { };
unique_ptr<entry[]> m_Start;
template <typename UC>
void attach_handler(void (UC::*m)(int&))
{
entry* p = 0;
do {
} while(--p != m_Start.get());
}
};
template <typename TC>
class request_dispatcher
: private dynamic_dispatch<void (TC::*)(int&)>
{ request_dispatcher(); };
struct file_reader
{
void execute_command(int&);
};
template <>
request_dispatcher<file_reader>::request_dispatcher()
{ this->attach_handler(&file_reader::execute_command); }