summaryrefslogtreecommitdiffstats
path: root/gcc/cp
diff options
context:
space:
mode:
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2006-06-15 03:40:42 +0000
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>2006-06-15 03:40:42 +0000
commitba0c587d50e4790567d236564e18cbc914ffe9f1 (patch)
tree647d15523e803e7975f50c20452c01c4ed2d27aa /gcc/cp
parent3888aa45db652f116256870f2bc75cd3a2b847d8 (diff)
downloadppe42-gcc-ba0c587d50e4790567d236564e18cbc914ffe9f1.tar.gz
ppe42-gcc-ba0c587d50e4790567d236564e18cbc914ffe9f1.zip
PR c++/26748
* parser.c (cp_parser_declarator): Robustify. PR c++/26748 * g++.dg/ext/attrib22.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114667 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/parser.c41
2 files changed, 22 insertions, 22 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index afd2f7af5b7..be561f9bbc8 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2006-06-14 Mark Mitchell <mark@codesourcery.com>
+ PR c++/26748
+ * parser.c (cp_parser_declarator): Robustify.
+
PR c++/26559
* pt.c (tsubst_expr): Use finish_omp_atomic.
(value_dependent_expression_p): All CALL_EXPRs are dependent.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index eaebe191c54..df175fa21ae 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -3374,12 +3374,12 @@ cp_parser_unqualified_id (cp_parser* parser,
qualifying_scope = parser->qualifying_scope;
/* If the name is of the form "X::~X" it's OK. */
+ token = cp_lexer_peek_token (parser->lexer);
if (scope && TYPE_P (scope)
- && cp_lexer_next_token_is (parser->lexer, CPP_NAME)
+ && token->type == CPP_NAME
&& (cp_lexer_peek_nth_token (parser->lexer, 2)->type
== CPP_OPEN_PAREN)
- && (cp_lexer_peek_token (parser->lexer)->value
- == TYPE_IDENTIFIER (scope)))
+ && constructor_name_p (token->value, scope))
{
cp_lexer_consume_token (parser->lexer);
return build_nt (BIT_NOT_EXPR, scope);
@@ -3550,20 +3550,6 @@ cp_parser_nested_name_specifier_opt (cp_parser *parser,
cp_token_position start = 0;
cp_token *token;
- /* If the next token corresponds to a nested name specifier, there
- is no need to reparse it. However, if CHECK_DEPENDENCY_P is
- false, it may have been true before, in which case something
- like `A<X>::B<Y>::C' may have resulted in a nested-name-specifier
- of `A<X>::', where it should now be `A<X>::B<Y>::'. So, when
- CHECK_DEPENDENCY_P is false, we have to fall through into the
- main loop. */
- if (check_dependency_p
- && cp_lexer_next_token_is (parser->lexer, CPP_NESTED_NAME_SPECIFIER))
- {
- cp_parser_pre_parsed_nested_name_specifier (parser);
- return parser->scope;
- }
-
/* Remember where the nested-name-specifier starts. */
if (cp_parser_uncommitted_to_tentative_parse_p (parser))
{
@@ -3663,6 +3649,8 @@ cp_parser_nested_name_specifier_opt (cp_parser *parser,
class-or-namespace-name. */
parser->scope = old_scope;
parser->qualifying_scope = saved_qualifying_scope;
+ if (cp_parser_uncommitted_to_tentative_parse_p (parser))
+ break;
/* If the next token is an identifier, and the one after
that is a `::', then any valid interpretation would have
found a class-or-namespace-name. */
@@ -8797,10 +8785,19 @@ cp_parser_template_id (cp_parser *parser,
template_id = build_min_nt (TEMPLATE_ID_EXPR, template, arguments);
else if (DECL_CLASS_TEMPLATE_P (template)
|| DECL_TEMPLATE_TEMPLATE_PARM_P (template))
- template_id
- = finish_template_type (template, arguments,
- cp_lexer_next_token_is (parser->lexer,
- CPP_SCOPE));
+ {
+ bool entering_scope;
+ /* In "template <typename T> ... A<T>::", A<T> is the abstract A
+ template (rather than some instantiation thereof) only if
+ is not nested within some other construct. For example, in
+ "template <typename T> void f(T) { A<T>::", A<T> is just an
+ instantiation of A. */
+ entering_scope = (template_parm_scope_p ()
+ && cp_lexer_next_token_is (parser->lexer,
+ CPP_SCOPE));
+ template_id
+ = finish_template_type (template, arguments, entering_scope);
+ }
else
{
/* If it's not a class-template or a template-template, it should be
@@ -11283,7 +11280,7 @@ cp_parser_declarator (cp_parser* parser,
member_p);
}
- if (attributes && declarator != cp_error_declarator)
+ if (attributes && declarator && declarator != cp_error_declarator)
declarator->attributes = attributes;
return declarator;
OpenPOWER on IntegriCloud