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:
parent
2838468cc3
commit
4db98b6eb5
4 changed files with 68 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
50
gcc/testsuite/g++.dg/template/array21.C
Normal file
50
gcc/testsuite/g++.dg/template/array21.C
Normal 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); }
|
Loading…
Add table
Reference in a new issue