From d38f6bc03eaaad33870a9bdb802c4568890ced65 Mon Sep 17 00:00:00 2001
From: Dodji Seketeli <dodji@redhat.com>
Date: Mon, 19 Apr 2010 09:32:16 +0000
Subject: [PATCH] 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
---
 gcc/cp/ChangeLog                          |  7 ++++
 gcc/cp/typeck.c                           | 11 +++---
 gcc/testsuite/ChangeLog                   |  5 +++
 gcc/testsuite/g++.dg/template/typedef32.C | 45 +++++++++++++++++++++++
 4 files changed, 63 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/template/typedef32.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 208b745cbcb0..64a440d3ee31 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+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
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 383754bea4df..c43cf331c973 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -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))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 868ce20d31ed..8215f8363b89 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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	
diff --git a/gcc/testsuite/g++.dg/template/typedef32.C b/gcc/testsuite/g++.dg/template/typedef32.C
new file mode 100644
index 000000000000..b3c4b90228fc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/typedef32.C
@@ -0,0 +1,45 @@
+// 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;
+};
+
-- 
GitLab