aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-parser.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2009-01-12 20:44:33 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2009-01-12 20:44:33 +0100
commit634b5df5d5c0ccfaa523ca0f9a737df3c0f28372 (patch)
tree7eb464794074dac1ac24e5ca0d2dc38255415b91 /gcc/c-parser.c
parent89b7d5e1898644c9bfd7012181f18cc4523e29cc (diff)
downloadgcc-634b5df5d5c0ccfaa523ca0f9a737df3c0f28372.zip
gcc-634b5df5d5c0ccfaa523ca0f9a737df3c0f28372.tar.gz
gcc-634b5df5d5c0ccfaa523ca0f9a737df3c0f28372.tar.bz2
re PR c/32041 (offsetof buglet)
PR c/32041 * c-parser.c (c_parser_postfix_expression): Allow `->' in offsetof member-designator, handle it as `[0].'. * parser.c (cp_parser_builtin_offsetof): Allow `->' in offsetof member-designator, handle it as `[0].'. * gcc.dg/pr32041.c: New test. * g++.dg/parse/offsetof9.C: New test. From-SVN: r143305
Diffstat (limited to 'gcc/c-parser.c')
-rw-r--r--gcc/c-parser.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/c-parser.c b/gcc/c-parser.c
index 99c6c18..5cb1982 100644
--- a/gcc/c-parser.c
+++ b/gcc/c-parser.c
@@ -5273,10 +5273,21 @@ c_parser_postfix_expression (c_parser *parser)
c_parser_consume_token (parser);
while (c_parser_next_token_is (parser, CPP_DOT)
|| c_parser_next_token_is (parser,
- CPP_OPEN_SQUARE))
+ CPP_OPEN_SQUARE)
+ || c_parser_next_token_is (parser,
+ CPP_DEREF))
{
- if (c_parser_next_token_is (parser, CPP_DOT))
+ if (c_parser_next_token_is (parser, CPP_DEREF))
+ {
+ loc = c_parser_peek_token (parser)->location;
+ offsetof_ref = build_array_ref (offsetof_ref,
+ integer_zero_node,
+ loc);
+ goto do_dot;
+ }
+ else if (c_parser_next_token_is (parser, CPP_DOT))
{
+ do_dot:
c_parser_consume_token (parser);
if (c_parser_next_token_is_not (parser,
CPP_NAME))