diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-01-12 20:44:33 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-01-12 20:44:33 +0100 |
commit | 634b5df5d5c0ccfaa523ca0f9a737df3c0f28372 (patch) | |
tree | 7eb464794074dac1ac24e5ca0d2dc38255415b91 /gcc/c-parser.c | |
parent | 89b7d5e1898644c9bfd7012181f18cc4523e29cc (diff) | |
download | gcc-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.c | 15 |
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)) |