Commit a7324e75 by Mark Mitchell Committed by Mark Mitchell

re PR c++/13736 (Parser confused on compound casts)

	PR c++/13736
	* parser.c (cp_parser_direct_declarator): Do not prevent
	backtracking inside a parenthesized declarator.
	(cp_parser_parameter_declaration): Fix typo in comment.

	PR c++/13736
	* g++.dg/parse/cast2.C (main): New test.

From-SVN: r76825
parent d173e685
2004-01-28 Mark Mitchell <mark@codesourcery.com>
PR c++/13736
* parser.c (cp_parser_direct_declarator): Do not prevent
backtracking inside a parenthesized declarator.
(cp_parser_parameter_declaration): Fix typo in comment.
2004-01-28 Jan Hubicka <jh@suse.cz> 2004-01-28 Jan Hubicka <jh@suse.cz>
* semantics.c (expand_body) Do emit_associated_thunks before * semantics.c (expand_body) Do emit_associated_thunks before
......
...@@ -10285,15 +10285,20 @@ cp_parser_direct_declarator (cp_parser* parser, ...@@ -10285,15 +10285,20 @@ cp_parser_direct_declarator (cp_parser* parser,
declarator. */ declarator. */
if (first) if (first)
{ {
bool saved_in_type_id_in_expr_p;
parser->default_arg_ok_p = saved_default_arg_ok_p; parser->default_arg_ok_p = saved_default_arg_ok_p;
parser->in_declarator_p = saved_in_declarator_p; parser->in_declarator_p = saved_in_declarator_p;
/* Consume the `('. */ /* Consume the `('. */
cp_lexer_consume_token (parser->lexer); cp_lexer_consume_token (parser->lexer);
/* Parse the nested declarator. */ /* Parse the nested declarator. */
saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
parser->in_type_id_in_expr_p = true;
declarator declarator
= cp_parser_declarator (parser, dcl_kind, ctor_dtor_or_conv_p, = cp_parser_declarator (parser, dcl_kind, ctor_dtor_or_conv_p,
/*parenthesized_p=*/NULL); /*parenthesized_p=*/NULL);
parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
first = false; first = false;
/* Expect a `)'. */ /* Expect a `)'. */
if (!cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'")) if (!cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'"))
...@@ -11048,11 +11053,11 @@ cp_parser_parameter_declaration (cp_parser *parser, ...@@ -11048,11 +11053,11 @@ cp_parser_parameter_declaration (cp_parser *parser,
if (!parser->in_template_argument_list_p if (!parser->in_template_argument_list_p
/* In an expression context, having seen: /* In an expression context, having seen:
(int((char *)... (int((char ...
we cannot be sure whether we are looking at a we cannot be sure whether we are looking at a
function-type (taking a "char*" as a parameter) or a cast function-type (taking a "char" as a parameter) or a cast
of some object of type "char*" to "int". */ of some object of type "char" to "int". */
&& !parser->in_type_id_in_expr_p && !parser->in_type_id_in_expr_p
&& cp_parser_parsing_tentatively (parser) && cp_parser_parsing_tentatively (parser)
&& !cp_parser_committed_to_tentative_parse (parser) && !cp_parser_committed_to_tentative_parse (parser)
......
2004-01-28 Mark Mitchell <mark@codesourcery.com>
PR c++/13736
* g++.dg/parse/cast2.C (main): New test.
2004-01-27 James E Wilson <wilson@specifixinc.com> 2004-01-27 James E Wilson <wilson@specifixinc.com>
* objc.dg/encode-2.m (main): New local string. Set depending on * objc.dg/encode-2.m (main): New local string. Set depending on
......
// PR c++/13736
struct string
{
string() {}
string(const string&) {}
string(const char*) {}
};
int main()
{
string s2(string( (const char*)("")));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment