diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 208b745cbcb0941b5583248e1eac7d4971b6336b..64a440d3ee3101f31dab324d7124cfadd01ff420 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 383754bea4df94995609f09edaa8dfaa0b10a597..c43cf331c9730df708bce7a526247040dd41a579 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 868ce20d31edacc4c1267735946be81186cee502..8215f8363b899901abdc4f624bd6e9ea2dbdc6e1 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 0000000000000000000000000000000000000000..b3c4b90228fce3e4b11a3b8c83c6f7d56593e5ca
--- /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;
+};
+