aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2003-01-13 00:16:12 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2003-01-13 00:16:12 +0000
commit8fa1ad0e6a073ff581090e2eb9658af2b7fb873a (patch)
tree09a72e3ecc7a33e76258030be3182d05d3cd19bd /gcc
parente8f2b18d0ec4fc04cba5d9ea60350645247c6548 (diff)
downloadgcc-8fa1ad0e6a073ff581090e2eb9658af2b7fb873a.zip
gcc-8fa1ad0e6a073ff581090e2eb9658af2b7fb873a.tar.gz
gcc-8fa1ad0e6a073ff581090e2eb9658af2b7fb873a.tar.bz2
re PR c++/9264 ([parser] ICE on invalid octal constant)
* cp-tree.h (get_arglist_len_in_bytes): Remove. PR c++/9264 * parser.c (cp_parser_elaborated_type_specifier): Handle erroneous typeame types more robustly. PR c++/9172 * g++.dg/parse/typename1.C: New file. From-SVN: r61236
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/parser.c12
-rw-r--r--gcc/testsuite/g++.dg/parse/typename1.C5
4 files changed, 21 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 47dc6fa..4111b95 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2003-01-12 Mark Mitchell <mark@codesourcery.com>
+
+ * cp-tree.h (get_arglist_len_in_bytes): Remove.
+
+ PR c++/9264
+ * parser.c (cp_parser_elaborated_type_specifier): Handle erroneous
+ typeame types more robustly.
+
2003-01-11 Phil Edwards <pme@gcc.gnu.org>
* parser.c: Fix comment typos.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index a9d4f2b..313b124 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3581,7 +3581,6 @@ extern GTY(()) operator_name_info_t assignment_operator_name_info
/* in call.c */
extern bool check_dtor_name (tree, tree);
-extern int get_arglist_len_in_bytes (tree);
extern tree build_vfield_ref (tree, tree);
extern tree build_scoped_method_call (tree, tree, tree, tree);
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index acbfd11..21d5d21 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -9012,10 +9012,14 @@ cp_parser_elaborated_type_specifier (parser, is_friend, is_declaration)
/*current_scope_valid_p=*/false);
/* Look for the nested-name-specifier. */
if (tag_type == typename_type)
- cp_parser_nested_name_specifier (parser,
- /*typename_keyword_p=*/true,
- /*check_dependency_p=*/true,
- /*type_p=*/true);
+ {
+ if (cp_parser_nested_name_specifier (parser,
+ /*typename_keyword_p=*/true,
+ /*check_dependency_p=*/true,
+ /*type_p=*/true)
+ == error_mark_node)
+ return error_mark_node;
+ }
else
/* Even though `typename' is not present, the proposed resolution
to Core Issue 180 says that in `class A<T>::B', `B' should be
diff --git a/gcc/testsuite/g++.dg/parse/typename1.C b/gcc/testsuite/g++.dg/parse/typename1.C
new file mode 100644
index 0000000..2af84e3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/typename1.C
@@ -0,0 +1,5 @@
+template <class baz>
+struct bar
+{
+ typedef typename baz::typename rebind<int> foo; // { dg-error "" }
+};