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> 2010-04-19 Jakub Jelinek <jakub@redhat.com>
* cp-tree.h (SCOPED_ENUM_P, UNSCOPED_ENUM_P, SET_SCOPED_ENUM_P): Use * 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) ...@@ -1236,6 +1236,12 @@ structural_comptypes (tree t1, tree t2, int strict)
if (TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2)) if (TYPE_FOR_JAVA (t1) != TYPE_FOR_JAVA (t2))
return false; 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 /* Allow for two different type nodes which have essentially the same
definition. Note that we already checked for equality of the type definition. Note that we already checked for equality of the type
qualifiers (just above). */ qualifiers (just above). */
...@@ -1244,11 +1250,6 @@ structural_comptypes (tree t1, tree t2, int strict) ...@@ -1244,11 +1250,6 @@ structural_comptypes (tree t1, tree t2, int strict)
&& TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2)) && TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
return true; 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. */ /* Compare the types. Break out if they could be the same. */
switch (TREE_CODE (t1)) 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> 2010-04-19 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/37027 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