From 9bf0e5888c1217afef058dbb59cb5d7824c4bba2 Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Fri, 10 Dec 2004 16:04:22 +0000 Subject: [PATCH] re PR c++/18731 (ICE on invalid template declaration) PR c++/18731 * parser.c (cp_parser_class_head): Reject typedef-name in class head. * g++.dg/parser/struct-1.C: New test. * g++.dg/parser/struct-2.C: New test. * g++.dg/parser/struct-3.C: New test. From-SVN: r91993 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/parser.c | 9 +++++++++ gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/parse/struct-1.C | 4 ++++ gcc/testsuite/g++.dg/parse/struct-2.C | 7 +++++++ gcc/testsuite/g++.dg/parse/struct-3.C | 10 ++++++++++ 6 files changed, 42 insertions(+) create mode 100644 gcc/testsuite/g++.dg/parse/struct-1.C create mode 100644 gcc/testsuite/g++.dg/parse/struct-2.C create mode 100644 gcc/testsuite/g++.dg/parse/struct-3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 83fac5a9f0c..1abbc26e039 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2004-12-10 Volker Reichelt + + PR c++/18731 + * parser.c (cp_parser_class_head): Reject typedef-name in class head. + 2004-12-09 Matt Austern PR c++/18514 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 64f468d4a2b..b728ad1d1b6 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -12620,6 +12620,15 @@ cp_parser_class_head (cp_parser* parser, else if (nested_name_specifier) { tree scope; + + /* Reject typedef-names in class heads. */ + if (!DECL_IMPLICIT_TYPEDEF_P (type)) + { + error ("invalid class name in declaration of %qD", type); + type = NULL_TREE; + goto done; + } + /* Figure out in what scope the declaration is being placed. */ scope = current_scope (); /* If that scope does not contain the scope in which the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 896b5c755f9..08e72216beb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2004-12-10 Volker Reichelt + + PR c++/18731 + * g++.dg/parser/struct-1.C: New test. + * g++.dg/parser/struct-2.C: New test. + * g++.dg/parser/struct-3.C: New test. + 2004-12-09 Richard Henderson * gcc.dg/loop-3.c: Don't use i386 tuning for amd64. diff --git a/gcc/testsuite/g++.dg/parse/struct-1.C b/gcc/testsuite/g++.dg/parse/struct-1.C new file mode 100644 index 00000000000..6e0d93aadf4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-1.C @@ -0,0 +1,4 @@ +// Origin: Volker Reichelt +// PR c++/18731 + +template struct T::A {}; // { dg-error "invalid class name" } diff --git a/gcc/testsuite/g++.dg/parse/struct-2.C b/gcc/testsuite/g++.dg/parse/struct-2.C new file mode 100644 index 00000000000..b63045bf9d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-2.C @@ -0,0 +1,7 @@ +// Origin: Volker Reichelt +// PR c++/18731 + +template struct A +{ + struct T::B {}; // { dg-error "invalid class name" } +}; diff --git a/gcc/testsuite/g++.dg/parse/struct-3.C b/gcc/testsuite/g++.dg/parse/struct-3.C new file mode 100644 index 00000000000..8e73ce4f019 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-3.C @@ -0,0 +1,10 @@ +// Origin: Volker Reichelt +// PR c++/18731 + +struct A +{ + struct B; + typedef B C; +}; + +struct A::C {}; // { dg-error "invalid class name" } -- 2.30.2