aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2010-04-20 19:23:45 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2010-04-20 21:23:45 +0200
commit5a80a1ddff8f6a6c5b7395a258361f8d46106657 (patch)
tree62f4ffad70d86ffc0bbafdc9ecb49f5d873e0a6d
parent9c4174d8533b2aa1386eb24a8a0debc642773e11 (diff)
downloadgcc-5a80a1ddff8f6a6c5b7395a258361f8d46106657.zip
gcc-5a80a1ddff8f6a6c5b7395a258361f8d46106657.tar.gz
gcc-5a80a1ddff8f6a6c5b7395a258361f8d46106657.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/typeck.c15
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/template/typedef32.C5
-rw-r--r--gcc/testsuite/g++.dg/template/typedef33.C21
5 files changed, 53 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 8c264f5..83945e2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+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.
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index c43cf33..bc699a1 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -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. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3f1d530..186c8ae 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+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
diff --git a/gcc/testsuite/g++.dg/template/typedef32.C b/gcc/testsuite/g++.dg/template/typedef32.C
index b3c4b90..b32e66c 100644
--- a/gcc/testsuite/g++.dg/template/typedef32.C
+++ b/gcc/testsuite/g++.dg/template/typedef32.C
@@ -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 {};
};
diff --git a/gcc/testsuite/g++.dg/template/typedef33.C b/gcc/testsuite/g++.dg/template/typedef33.C
new file mode 100644
index 0000000..1d2117b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/typedef33.C
@@ -0,0 +1,21 @@
+// 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
+