aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2004-12-01 16:37:32 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2004-12-01 16:37:32 +0000
commit07c65e005e3c402d07297b9ce4df2e5ef5f433e2 (patch)
tree5a37eb2fb4fc35e6cc3cd6c36dce910c1b94477d
parentf8e7ffa67339a806d5ae5d8a3fb0f37353bd53e5 (diff)
downloadgcc-07c65e005e3c402d07297b9ce4df2e5ef5f433e2.zip
gcc-07c65e005e3c402d07297b9ce4df2e5ef5f433e2.tar.gz
gcc-07c65e005e3c402d07297b9ce4df2e5ef5f433e2.tar.bz2
re PR c++/18729 (ICE on invalid typedef)
cp: PR c++/18729 * parser.c (cp_parser_class_name): Check decl's type is not error_mark_node. testsuite: PR C++/18729 * g++.dg/parse/crash20.C: New. From-SVN: r91566
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/parser.c1
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/parse/crash20.C14
4 files changed, 22 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 81d1dc8..8b267c3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2004-12-01 Nathan Sidwell <nathan@codesourcery.com>
+ PR c++/18729
+ * parser.c (cp_parser_class_name): Check decl's type is not
+ error_mark_node.
+
PR c++/17431
* call.c (standard_conversion): Add FLAGS parameter. Do not allow
derived to base conversion when checking constructor
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 0e0dccd..3e25076 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -12232,6 +12232,7 @@ cp_parser_class_name (cp_parser *parser,
decl = TYPE_NAME (make_typename_type (scope, decl, tag_type, tf_error));
else if (decl == error_mark_node
|| TREE_CODE (decl) != TYPE_DECL
+ || TREE_TYPE (decl) == error_mark_node
|| !IS_AGGR_TYPE (TREE_TYPE (decl)))
{
cp_parser_error (parser, "expected class-name");
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e960995..3e61438 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2004-12-01 Nathan Sidwell <nathan@codesourcery.com>
+ PR C++/18729
+ * g++.dg/parse/crash20.C: New.
+
PR c++/17431
* g++.dg/overload/arg1.C: New.
* g++.dg/overload/arg2.C: New.
diff --git a/gcc/testsuite/g++.dg/parse/crash20.C b/gcc/testsuite/g++.dg/parse/crash20.C
new file mode 100644
index 0000000..b39e572
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash20.C
@@ -0,0 +1,14 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 Dec 2004 <nathan@codesourcery.com>
+
+// PR 18729: ICE on ill formed
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+template<typename T> struct A
+{
+ typedef typename T::X Y; // { dg-error "not a class" "" }
+};
+
+A<int>::Y y; // { dg-error "instantiated from here" "" }