gcc/cp/ChangeLog:
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Dec 2004 12:33:09 +0000 (12:33 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 9 Dec 2004 12:33:09 +0000 (12:33 +0000)
PR c++/18757
* parser.c (cp_parser_template_id): Don't create a CPP_TEMPLATE_ID
if parsing failed.
gcc/testsuite/ChangeLog:
* g++.dg/parse/typename5.C: Adjust for new error.
* g++.dg/parse/typename7.C: New.

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

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

index 202e416..696349f 100644 (file)
@@ -1,3 +1,9 @@
+2004-12-09  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR c++/18757
+       * parser.c (cp_parser_template_id): Don't create a CPP_TEMPLATE_ID
+       if parsing failed.
+
 2004-12-09  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        PR c++/18073
index dae68f3..ce3c7a6 100644 (file)
@@ -8416,8 +8416,9 @@ cp_parser_template_id (cp_parser *parser,
      should we re-parse the token stream, we will not have to repeat
      the effort required to do the parse, nor will we issue duplicate
      error messages about problems during instantiation of the
-     template.  */
-  if (start_of_id)
+     template.  Do so only if parsing succeeded, otherwise we may
+     silently accept template arguments with syntax errors.  */
+  if (start_of_id && !cp_parser_error_occurred (parser))
     {
       cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
       
index 54b1dfe..51d6be5 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-09  Alexandre Oliva  <aoliva@redhat.com>
+
+       * g++.dg/parse/typename5.C: Adjust for new error.
+       * g++.dg/parse/typename7.C: New.
+
 2004-12-09  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        PR c++/18073
index 6b2ed89..3664751 100644 (file)
@@ -8,5 +8,5 @@ template <typename> struct A {};
 
 template <typename> struct B
 {
-    typedef A<typename X::Y> C; // { dg-error "declared|invalid|no type" }
+    typedef A<typename X::Y> C; // { dg-error "declared|invalid|no type|expected" }
 };
diff --git a/gcc/testsuite/g++.dg/parse/typename7.C b/gcc/testsuite/g++.dg/parse/typename7.C
new file mode 100644 (file)
index 0000000..2119317
--- /dev/null
@@ -0,0 +1,31 @@
+// { dg-do compile }
+
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> and
+// Alexandre Oliva <aoliva@redhat.com>
+
+// PR c++/18757: ICE in get_innermost_template_args
+
+struct A
+{
+  template<typename>   void foo(int);
+  template<typename T> void bar(T t) {
+    this->foo<typename T>(t); } // { dg-error "expected" }
+  template<typename T> void bad(T t) {
+    foo<typename T>(t); } // { dg-error "expected" }
+};
+
+template <typename T>
+struct B
+{
+  void bar(T t) {
+    A().bar<typename T>(t); } // { dg-error "expected" }
+  void bad(T t) {
+    B<typename T>::bar(t); } // { dg-error "invalid|not a template" }
+};
+
+void baz()
+{
+    A().bar(0);
+    A().bad(0);
+    B<int>().bar(0);
+}