re PR c++/33836 (ICE with invalid use of &&)

PR c++/33836
	* parser.c (cp_parser_unary_expression): For &&label call
	cp_parser_non_integral_constant_expression and return error_mark_node
	if it returned true.

	* g++.dg/ext/label10.C: New test.

From-SVN: r129896
This commit is contained in:
Jakub Jelinek 2007-11-05 09:18:03 +01:00 committed by Jakub Jelinek
parent 1b021ff438
commit f370e66bb8
4 changed files with 31 additions and 1 deletions

View File

@ -1,5 +1,10 @@
2007-11-05 Jakub Jelinek <jakub@redhat.com>
PR c++/33836
* parser.c (cp_parser_unary_expression): For &&label call
cp_parser_non_integral_constant_expression and return error_mark_node
if it returned true.
PR c++/33969
* decl.c (grokdeclarator): Don't call build_memfn_type if type
is neither FUNCTION_TYPE nor METHOD_TYPE.

View File

@ -5329,13 +5329,18 @@ cp_parser_unary_expression (cp_parser *parser, bool address_p, bool cast_p)
&& token->type == CPP_AND_AND)
{
tree identifier;
tree expression;
/* Consume the '&&' token. */
cp_lexer_consume_token (parser->lexer);
/* Look for the identifier. */
identifier = cp_parser_identifier (parser);
/* Create an expression representing the address. */
return finish_label_address_expr (identifier);
expression = finish_label_address_expr (identifier);
if (cp_parser_non_integral_constant_expression (parser,
"the address of a label"))
expression = error_mark_node;
return expression;
}
}
if (unary_operator != ERROR_MARK)

View File

@ -1,5 +1,8 @@
2007-11-05 Jakub Jelinek <jakub@redhat.com>
PR c++/33836
* g++.dg/ext/label10.C: New test.
PR c++/33969
* g++.dg/other/ptrmem9.C: New test.

View File

@ -0,0 +1,17 @@
// PR c++/33836
// { dg-do compile }
// { dg-options "-std=gnu++98" }
template<int N> struct A
{
enum { M = && N }; // { dg-error "referenced outside|cannot appear in" }
};
A<0> a;
void foo ()
{
__label__ P;
enum { O = && P }; // { dg-error "cannot appear in" }
P:;
}