diff options
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/parser.c | 14 |
2 files changed, 14 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index de7d1ab..c81a1e6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2009-01-12 Jakub Jelinek <jakub@redhat.com> + PR c/32041 + * parser.c (cp_parser_builtin_offsetof): Allow `->' in + offsetof member-designator, handle it as `[0].'. + PR c++/38794 * decl.c (start_function): If grokdeclarator hasn't returned FUNCTION_DECL nor error_mark_node, issue diagnostics. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index f497d66..bf742eea 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1,6 +1,6 @@ /* C++ Parser. Copyright (C) 2000, 2001, 2002, 2003, 2004, - 2005, 2007, 2008 Free Software Foundation, Inc. + 2005, 2007, 2008, 2009 Free Software Foundation, Inc. Written by Mark Mitchell <mark@codesourcery.com>. This file is part of GCC. @@ -6627,7 +6627,8 @@ cp_parser_constant_expression (cp_parser* parser, offsetof-member-designator: id-expression | offsetof-member-designator "." id-expression - | offsetof-member-designator "[" expression "]" */ + | offsetof-member-designator "[" expression "]" + | offsetof-member-designator "->" id-expression */ static tree cp_parser_builtin_offsetof (cp_parser *parser) @@ -6670,11 +6671,16 @@ cp_parser_builtin_offsetof (cp_parser *parser) expr = cp_parser_postfix_open_square_expression (parser, expr, true); break; + case CPP_DEREF: + /* offsetof-member-designator "->" identifier */ + expr = grok_array_decl (expr, integer_zero_node); + /* FALLTHRU */ + case CPP_DOT: /* offsetof-member-designator "." identifier */ cp_lexer_consume_token (parser->lexer); - expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DOT, expr, - true, &dummy, + expr = cp_parser_postfix_dot_deref_expression (parser, CPP_DOT, + expr, true, &dummy, token->location); break; |