summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-23 04:37:40 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-23 04:37:40 +0000
commit7525f7696fb07ad6486625b0bca9497b65f00cd4 (patch)
tree9723544456dacd2f3c339caf6c315be105a9a932
parentdacbeac0ec7e3b131c607c2cc0367a2d5b15cbfe (diff)
downloadgcc-7525f7696fb07ad6486625b0bca9497b65f00cd4.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123152 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c5
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/parse/tmpl-outside1.C3
-rw-r--r--gcc/testsuite/g++.dg/template/error24.C8
5 files changed, 24 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3de84b69166..523d52b85f0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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>
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 41e7b52f980..5cfcf435ed2 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -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. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a22b4c88e9e..1cbb1affaaf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,11 @@
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
* g++.dg/expr/bitfield7.C: New test.
diff --git a/gcc/testsuite/g++.dg/parse/tmpl-outside1.C b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C
index 4b8bb723cac..e63e3cd4412 100644
--- a/gcc/testsuite/g++.dg/parse/tmpl-outside1.C
+++ b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C
@@ -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
index 00000000000..9ce5cbbc2f9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/error24.C
@@ -0,0 +1,8 @@
+// PR c++/30863
+
+template <typename T>
+struct s {};
+
+void f() {
+ unsigned s<int> x; // { dg-error "invalid" }
+}