Commit d38f6bc0 by Dodji Seketeli Committed by Dodji Seketeli

re PR c++/43704 (ICE: tree check: accessed elt 2 of tree_vec with 1 elts in…

re PR c++/43704 (ICE: tree check: accessed elt 2 of tree_vec with 1 elts in tsubst, at cp/pt.c:10074)

Fix PR c++/43704

gcc/cp/ChangeLog:
	PR c++/43704
	* typeck.c (structural_comptypes): Test dependent typedefs
	incompatibility before testing for their main variant based
	equivalence.

gcc/testsuite/ChangeLog:
	PR c++/43704
	* g++.dg/template/typedef32.C: New test.

From-SVN: r158508
parent b5aeb3bb
2010-04-19 Dodji Seketeli <dodji@redhat.com>
PR c++/43704
* typeck.c (structural_comptypes): Test dependent typedefs
incompatibility before testing for their main variant based
equivalence.
2010-04-19 Jakub Jelinek <jakub@redhat.com>
* cp-tree.h (SCOPED_ENUM_P, UNSCOPED_ENUM_P, SET_SCOPED_ENUM_P): Use
......
......@@ -1236,6 +1236,12 @@ structural_comptypes (tree t1, tree t2, int strict)
if (TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2))
return false;
/* If T1 and T2 are dependent typedefs then check upfront that
the template parameters of their typedef DECLs match before
going down checking their subtypes. */
if (incompatible_dependent_types_p (t1, t2))
return false;
/* Allow for two different type nodes which have essentially the same
definition. Note that we already checked for equality of the type
qualifiers (just above). */
......@@ -1244,11 +1250,6 @@ structural_comptypes (tree t1, tree t2, int strict)
&& TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
return true;
/* If T1 and T2 are dependent typedefs then check upfront that
the template parameters of their typedef DECLs match before
going down checking their subtypes. */
if (incompatible_dependent_types_p (t1, t2))
return false;
/* Compare the types. Break out if they could be the same. */
switch (TREE_CODE (t1))
......
2010-04-19 Dodji Seketeli <dodji@redhat.com>
PR c++/43704
* g++.dg/template/typedef32.C: New test.
2010-04-19 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/37027
......
// Origin: PR c++/43704
// { dg-do compile }
template<typename T2, typename T3>
struct if_
{
typedef T2 type;
};
template<class I1>
struct iterator_restrict_traits
{
};
template<class T>
class matrix
{
class ci {};
class i {};
};
template<class M, class TRI>
struct triangular_adaptor
{
typedef typename if_<typename M::ci,typename M::i>::type ty1;
class iterator2 : iterator_restrict_traits<typename ty1::ic>::iterator_category
{
};
};
template<class M>
struct banded_adaptor
{
typedef typename if_<typename M::ci,typename M::i>::type ty1;
class iterator1 : iterator_restrict_traits<typename ty1::ic>::iterator_category
{
};
};
template<class T>
struct singular_decomposition
{
banded_adaptor<matrix<double> >::iterator1 it1;
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment