PR c++/9364, c++/10553, c++/10586
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Sat, 3 May 2003 11:58:17 +0000 (11:58 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Sat, 3 May 2003 11:58:17 +0000 (11:58 +0000)
PR c++/9364, c++/10553, c++/10586
* decl.c (make_typename_type): Don't crash on illegal code.

* g++.dg/parse/typename4.C: New test.
* g++.dg/parse/typename5.C: Likewise.

From-SVN: r66424

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

index 80da208226e360a2cd641a7b721b9a2470450f8a..07e5a655a4c9972162601bc659a1eb6a27b8771a 100644 (file)
@@ -1,3 +1,8 @@
+2003-05-03  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/9364, c++/10553, c++/10586
+       * decl.c (make_typename_type): Don't crash on illegal code.
+
 2003-05-03  Nathan Sidwell  <nathan@codesourcery.com>
 
        * class.c (finish_struct): Use location_t and input_location
index d090d2da13b9d788f0c3fd15b9aaf06610c05c81..6cbcd3f9c4b51de08d0358c705d4cbc4a9aada57 100644 (file)
@@ -5418,6 +5418,11 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain)
 {
   tree fullname;
 
+  if (name == error_mark_node
+      || context == NULL_TREE
+      || context == error_mark_node)
+    return error_mark_node;
+
   if (TYPE_P (name))
     {
       if (!(TYPE_LANG_SPECIFIC (name)
index 1f0db700e25ee9137e6180e71c9e095f03322a7b..3109c7556144a6e3fcca849420865af10615fbc5 100644 (file)
@@ -1,3 +1,9 @@
+2003-05-03  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/9364, c++/10553, c++/10586
+       * g++.dg/parse/typename4.C: New test.
+       * g++.dg/parse/typename5.C: Likewise.
+
 2003-05-03  Richard Sandiford  <rsandifo@redhat.com>
 
        * gcc.c-torture/compile/20030503-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/parse/typename4.C b/gcc/testsuite/g++.dg/parse/typename4.C
new file mode 100644 (file)
index 0000000..529889d
--- /dev/null
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+// Origin: Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de>
+
+// PR c++/9364: ICE processing typename with name error.
+
+void find(typename int&); // { dg-error "typename|void|expected" }
diff --git a/gcc/testsuite/g++.dg/parse/typename5.C b/gcc/testsuite/g++.dg/parse/typename5.C
new file mode 100644 (file)
index 0000000..70a2814
--- /dev/null
@@ -0,0 +1,12 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+// PR c++/10553: ICE processing typename with context error.
+
+template <typename> struct A {};
+
+template <typename> struct B
+{
+    typedef A<typename X::Y> C; // { dg-error "not a class-name|invalid|no type" }
+};