Commit 5a80a1dd by Dodji Seketeli Committed by Dodji Seketeli

re PR c++/43800 (FAIL: libgomp.c++/for-4.C)

Fix PR c++/43800

gcc/cp/ChangeLog:
	PR c++/43800
	PR c++/43704
	* typeck.c (incompatible_dependent_types_p): If one of the
	compared types if not a typedef then honour their main variant
	equivalence.

gcc/testsuite/ChangeLog:
	PR c++/43800
	PR c++/43704
	* g++.dg/template/typedef32.C: Adjust.
	* g++.dg/template/typedef33.C: New test.

From-SVN: r158571
parent 9c4174d8
2010-04-20 Dodji Seketeli <dodji@redhat.com>
PR c++/43800
PR c++/43704
* typeck.c (incompatible_dependent_types_p): If one of the
compared types if not a typedef then honour their main variant
equivalence.
2010-04-20 Jakub Jelinek <jakub@redhat.com>
* cp-tree.h (TYPE_REF_IS_RVALUE): Remove.
......
......@@ -1155,6 +1155,7 @@ static bool
incompatible_dependent_types_p (tree t1, tree t2)
{
tree tparms1 = NULL_TREE, tparms2 = NULL_TREE;
bool t1_typedef_variant_p, t2_typedef_variant_p;
if (!uses_template_parms (t1) || !uses_template_parms (t2))
return false;
......@@ -1167,10 +1168,22 @@ incompatible_dependent_types_p (tree t1, tree t2)
return true;
}
t1_typedef_variant_p = typedef_variant_p (t1);
t2_typedef_variant_p = typedef_variant_p (t2);
/* Either T1 or T2 must be a typedef. */
if (!typedef_variant_p (t1) && !typedef_variant_p (t2))
if (!t1_typedef_variant_p && !t2_typedef_variant_p)
return false;
if (!t1_typedef_variant_p || !t2_typedef_variant_p)
/* Either T1 or T2 is not a typedef so we cannot compare the
the template parms of the typedefs of T1 and T2.
At this point, if the main variant type of T1 and T2 are equal
it means the two types can't be incompatible, from the perspective
of this function. */
if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
return false;
/* So if we reach this point, it means either T1 or T2 is a typedef variant.
Let's compare their template parameters. */
......
2010-04-20 Dodji Seketeli <dodji@redhat.com>
PR c++/43800
PR c++/43704
* g++.dg/template/typedef32.C: Adjust.
* g++.dg/template/typedef33.C: New test.
2010-04-20 Paul Thomas <pault@gcc.gnu.org>
PR fortran/43227
......
......@@ -10,12 +10,13 @@ struct if_
template<class I1>
struct iterator_restrict_traits
{
struct iterator_category {};
};
template<class T>
class matrix
struct matrix
{
class ci {};
struct ci {struct ic {};};
class i {};
};
......
// Origin PR c++/43800
// { dg-do compile }
template<class T, class U=T>
struct V
{
typedef T t_type;
};
template<class T>
class J
{
typedef typename V<T>::t_type t_type;
const t_type& f(); // #0:
private:
t_type b;
};
template<class T>
const typename V<T>::t_type& J<T>::f() {return b;} // #1
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