cp:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Dec 2004 16:37:32 +0000 (16:37 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Dec 2004 16:37:32 +0000 (16:37 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@91566 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/crash20.C [new file with mode: 0644]

index 81d1dc8..8b267c3 100644 (file)
@@ -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
index 0e0dccd..3e25076 100644 (file)
@@ -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");
index e960995..3e61438 100644 (file)
@@ -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 (file)
index 0000000..b39e572
--- /dev/null
@@ -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" "" }