OSDN Git Service

Fix PR c++/43704
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Apr 2010 09:32:16 +0000 (09:32 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Apr 2010 09:32:16 +0000 (09:32 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158508 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/typedef32.C [new file with mode: 0644]

index 208b745..64a440d 100644 (file)
@@ -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
index 383754b..c43cf33 100644 (file)
@@ -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))
index 868ce20..8215f83 100644 (file)
@@ -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 (file)
index 0000000..b3c4b90
--- /dev/null
@@ -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;
+};
+