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; +}; +