re PR c++/30863 (Unsigned templatized struct treated as unsigned int)
authorMark Mitchell <mark@codesourcery.com>
Fri, 23 Mar 2007 04:37:40 +0000 (04:37 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Fri, 23 Mar 2007 04:37:40 +0000 (04:37 +0000)
PR c++/30863
* parser.c (cp_parser_parse_and_diagnose_invalid_type_name): Do
not consume tokens when failing.
PR c++/30863
* g++.dg/template/error24.C: New test.
* g++.dg/parse/tmpl-outside1.C: Tweak error markers.

From-SVN: r123152

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/tmpl-outside1.C
gcc/testsuite/g++.dg/template/error24.C [new file with mode: 0644]

index 3de84b69166d74e075f6573a02ea8c4ed72ed2a1..523d52b85f074502580e087c8c3c448427d66381 100644 (file)
@@ -1,3 +1,9 @@
+2007-03-22  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/30863
+       * parser.c (cp_parser_parse_and_diagnose_invalid_type_name): Do
+       not consume tokens when failing.
+
 2007-03-22  Jim Wilson  <wilson@specifix.com>
            Mark Mitchell  <mark@codesourcery.com>
 
index 41e7b52f9809d3f0a232c954a1721dee297eb658..5cfcf435ed21b5fa0fb270cd8e0e77b882b9e597 100644 (file)
@@ -2343,12 +2343,13 @@ cp_parser_parse_and_diagnose_invalid_type_name (cp_parser *parser)
      the scope is dependent, we cannot do much.  */
   if (!cp_lexer_next_token_is (parser->lexer, CPP_NAME)
       || (parser->scope && TYPE_P (parser->scope)
-         && dependent_type_p (parser->scope)))
+         && dependent_type_p (parser->scope))
+      || TREE_CODE (id) == TYPE_DECL)
     {
       cp_parser_abort_tentative_parse (parser);
       return false;
     }
-  if (!cp_parser_parse_definitely (parser) || TREE_CODE (id) == TYPE_DECL)
+  if (!cp_parser_parse_definitely (parser))
     return false;
 
   /* Emit a diagnostic for the invalid type.  */
index a22b4c88e9eb7f1e5bb76a2188a323872201cd2f..1cbb1affaaf8756ffd25e71836ac57316e04d30e 100644 (file)
@@ -1,3 +1,9 @@
+2007-03-22  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/30863
+       * g++.dg/template/error24.C: New test.
+       * g++.dg/parse/tmpl-outside1.C: Tweak error markers.
+
 2007-03-22  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/31273
index 4b8bb723cac712dca950ed997ab765ece3883165..e63e3cd44129c39857fd0bfca6a2fef47934d72a 100644 (file)
@@ -7,5 +7,4 @@ struct X
    template <int i> struct Y {};
 };
 
-typedef X::template Y<0> y; // { dg-error "template" }
-// { dg-bogus "with no type" "" { xfail *-*-* } 10 }
+typedef X::template Y<0> y; // { dg-error "template|invalid" }
diff --git a/gcc/testsuite/g++.dg/template/error24.C b/gcc/testsuite/g++.dg/template/error24.C
new file mode 100644 (file)
index 0000000..9ce5cbb
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/30863
+
+template <typename T>
+struct s {};
+
+void f() {
+  unsigned s<int> x; // { dg-error "invalid" }
+}