mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-21 08:40:30 +08:00
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:
parent
1b021ff438
commit
f370e66bb8
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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.
|
||||
|
||||
|
17
gcc/testsuite/g++.dg/ext/label10.C
Normal file
17
gcc/testsuite/g++.dg/ext/label10.C
Normal 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:;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user