From 9ce1594a3e521c3b0f6bd8b8eba1cc3a14e5ced7 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Sun, 23 May 2004 21:06:56 +0000 Subject: [PATCH] re PR c++/15025 (accepts redeclaration of template as non-template) PR c++/15025 * decl.c (xref_tag): Issue errors about redeclaring template classes as non-template classes. PR c++/15025 * g++.dg/template/redecl1.C: New test. From-SVN: r82172 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/redecl1.C | 4 ++++ 4 files changed, 22 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/redecl1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e6a652443b68..7fd46ac7108b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-05-23 Mark Mitchell + + PR c++/15025 + * decl.c (xref_tag): Issue errors about redeclaring template + classes as non-template classes. + 2004-05-23 Mark Mitchell PR c++/14821 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 65e8800beec8..b666dd7105d3 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -9407,6 +9407,13 @@ xref_tag (enum tag_types tag_code, tree name, { if (!globalize && processing_template_decl && IS_AGGR_TYPE (t)) redeclare_class_template (t, current_template_parms); + else if (!processing_template_decl + && CLASS_TYPE_P (t) + && CLASSTYPE_IS_TEMPLATE (t)) + { + error ("redeclaration of `%T' as a non-template", t); + t = error_mark_node; + } } POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d93b5c9a60e5..32d2f1717e0b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-05-23 Mark Mitchell + + PR c++/15025 + * g++.dg/template/redecl1.C: New test. + 2004-05-23 Mark Mitchell PR c++/14821 diff --git a/gcc/testsuite/g++.dg/template/redecl1.C b/gcc/testsuite/g++.dg/template/redecl1.C new file mode 100644 index 000000000000..1bbf20ec766c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/redecl1.C @@ -0,0 +1,4 @@ +// PR c++/15025 + +template struct X; +struct X {}; // { dg-error "" }