diff options
| -rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/cp/pt.c | 6 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/template/redecl2.C | 9 |
4 files changed, 25 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fcb0404..5655232 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-08-25 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/14428 + * pt.c (redeclare_class_template): Check the type of non-type and + template template parameter. + 2004-08-25 Nathan Sidwell <nathan@codesourcery.com> diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b995ba4..b93599e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3157,7 +3157,11 @@ redeclare_class_template (tree type, tree parms) tree tmpl_default = TREE_PURPOSE (TREE_VEC_ELT (tmpl_parms, i)); tree parm_default = TREE_PURPOSE (TREE_VEC_ELT (parms, i)); - if (TREE_CODE (tmpl_parm) != TREE_CODE (parm)) + /* TMPL_PARM and PARM can be either TYPE_DECL, PARM_DECL, or + TEMPLATE_DECL. */ + if (TREE_CODE (tmpl_parm) != TREE_CODE (parm) + || (TREE_CODE (tmpl_parm) != TYPE_DECL + && !same_type_p (TREE_TYPE (tmpl_parm), TREE_TYPE (parm)))) { cp_error_at ("template parameter `%#D'", tmpl_parm); error ("redeclared here as `%#D'", parm); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9a442c4..4647822 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-08-25 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/14428 + * g++.dg/template/redecl2.C: New test. + 2004-08-24 Bud Davis <bdavis9659@comcast.net> PR fortran/17143 diff --git a/gcc/testsuite/g++.dg/template/redecl2.C b/gcc/testsuite/g++.dg/template/redecl2.C new file mode 100644 index 0000000..4dd432e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/redecl2.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +// Origin: heinlein@informatik.uni-ulm.de + +// PR c++/14428: Redeclaration of class template with wrong +// non-type template parameter. + +template <int i> struct X; // { dg-error "template parameter" } +template <int* p> struct X; // { dg-error "redeclared here" } |
