aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2004-07-27 15:47:10 +0000
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>2004-07-27 15:47:10 +0000
commit00bdb87f8e8107ade3abd37e37db8270a0016bc3 (patch)
treef8e0486ef514e91ec9dffab97caca820bcbf2f22
parent18d7916e393bbc7f8213f07a31a7220cdbbb284b (diff)
downloadgcc-00bdb87f8e8107ade3abd37e37db8270a0016bc3.zip
gcc-00bdb87f8e8107ade3abd37e37db8270a0016bc3.tar.gz
gcc-00bdb87f8e8107ade3abd37e37db8270a0016bc3.tar.bz2
re PR c++/14429 (valid template template argument rejected)
PR c++/14429 * pt.c (coerce_template_template_parms) <PARM_DECL case>: Only check when the type of ARG is not dependent. * g++.dg/template/ttp11.C: New test. From-SVN: r85222
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/ttp11.C14
-rw-r--r--gcc/testsuite/g++.dg/template/ttp12.C19
5 files changed, 53 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 329b12e..3a270bc 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2004-07-27 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/14429
+ * pt.c (coerce_template_template_parms) <PARM_DECL case>: Only check
+ when the type of ARG is not dependent.
+
2004-07-26 Geoffrey Keating <geoffk@apple.com>
* g++spec.c (LIBSTDCXX_PROFILE): Default to LIBSTDCXX.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index ca84b39..7ae18f8 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -3639,11 +3639,16 @@ coerce_template_template_parms (tree parm_parms,
case PARM_DECL:
/* The tsubst call is used to handle cases such as
- template <class T, template <T> class TT> class D;
+
+ template <int> class C {};
+ template <class T, template <T> class TT> class D {};
+ D<int, C> d;
+
i.e. the parameter list of TT depends on earlier parameters. */
- if (!same_type_p
- (tsubst (TREE_TYPE (parm), outer_args, complain, in_decl),
- TREE_TYPE (arg)))
+ if (!dependent_type_p (TREE_TYPE (arg))
+ && !same_type_p
+ (tsubst (TREE_TYPE (parm), outer_args, complain, in_decl),
+ TREE_TYPE (arg)))
return 0;
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bf23710..bc4bea2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-07-27 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ PR c++/14429
+ * g++.dg/template/ttp11.C: New test.
+
2004-07-27 Diego Novillo <dnovillo@redhat.com>
* gcc.c-torture/compile/20040727-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/template/ttp11.C b/gcc/testsuite/g++.dg/template/ttp11.C
new file mode 100644
index 0000000..84867e1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ttp11.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Origin: heinlein@informatik.uni-ulm.de
+
+// PR c++/14429: Matching of template template parameter containing
+// non-type parameter with type that depends on earlier parameter.
+
+template <template <typename U, U* p> class T>
+struct X {};
+
+template <template <typename U, U* p> class T>
+struct Y {
+ X<T> x;
+};
diff --git a/gcc/testsuite/g++.dg/template/ttp12.C b/gcc/testsuite/g++.dg/template/ttp12.C
new file mode 100644
index 0000000..554738b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ttp12.C
@@ -0,0 +1,19 @@
+// Copyright (C) 2004 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Check the type of non-type parameter in template template parameter
+// only if it is dependent.
+
+template <template <int* p> class T>
+struct X {};
+
+template <typename U, template <U* p> class T>
+struct Y {
+ X<T> x;
+};
+
+template <int* p> struct Z {};
+
+Y<int, Z> y1;
+Y<char, Z> y2; // { dg-error "mismatch|expected|invalid" }