re PR c++/5767 (ICE with forwarding template template parameters)
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Thu, 7 Aug 2003 14:36:39 +0000 (14:36 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Thu, 7 Aug 2003 14:36:39 +0000 (14:36 +0000)
PR c++/5767
* parser.c (cp_parser_class_name): Return immediately when scope
is error_mark_node.

* g++.dg/parse/crash11.C: New test.

From-SVN: r70226

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

index 87f0107e023bc2f0ca9bd311cb0be71784317301..9c897331e6b2dcf4f9a1ef4bfaca931b82e6f053 100644 (file)
@@ -1,3 +1,9 @@
+2003-08-07  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/5767
+       * parser.c (cp_parser_class_name): Return immediately when scope
+       is error_mark_node.
+
 2003-08-07  Aldy Hernandez  <aldyh@redhat.com>
 
        * cp/Make-lang.in (cp/call.o): Add dependency for target.h.
index fce69ca6fe68aef17eb255ef22c991cfa5f0fd95..12f541a73967ef509260004c28e80f7ca54d6860 100644 (file)
@@ -10957,6 +10957,9 @@ cp_parser_class_name (cp_parser *parser,
   /* PARSER->SCOPE can be cleared when parsing the template-arguments
      to a template-id, so we save it here.  */
   scope = parser->scope;
+  if (scope == error_mark_node)
+    return error_mark_node;
+  
   /* Any name names a type if we're following the `typename' keyword
      in a qualified name where the enclosing scope is type-dependent.  */
   typename_p = (typename_keyword_p && scope && TYPE_P (scope)
index 0e039d53916aae2a4fcd3ffbe014b11599ef197a..9c7ea3bd8166d47bad7514ce9dedb312bca9c305 100644 (file)
@@ -1,3 +1,8 @@
+2003-08-07  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       PR c++/5767
+       * g++.dg/parse/crash11.C: New test.
+
 2003-08-06  Alexandre Oliva  <aoliva@redhat.com>
 
        * gcc.dg/cpp/spacing1.c: Update.
diff --git a/gcc/testsuite/g++.dg/parse/crash11.C b/gcc/testsuite/g++.dg/parse/crash11.C
new file mode 100644 (file)
index 0000000..8e6c73b
--- /dev/null
@@ -0,0 +1,34 @@
+// { dg-do compile }
+
+// Origin: priesnit@math.uni-goettingen.de
+
+// PR c++/5767: ICE parsing typename with invalid scope.
+
+template <template <typename> class TP>
+struct A
+{
+  template <typename T>
+  struct Template
+  {
+    typedef typename TP<T>::Type Type;
+  };
+};
+template <template <typename> class TP>
+struct B
+{
+  template <typename T>
+  struct Template
+  {
+    typedef typename A<A<TP>::Template>
+      ::template Template<T>::Type Type; { dg-error "mismatch|class template|unqualified-id" }
+  };
+};
+template <typename T>
+struct C
+{
+  typedef void Type;
+};
+int main()
+{
+  typedef B<C>::Template<void>::Type Type; { dg-error "init-declarator|;" }
+}