X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-parser.c;h=8238506b540606e6bea01a3517df0a37ba496446;hb=fc8788d51783c21bb740f5a6dc13d5c5bd13bb9b;hp=d12d90e6b3be0aadeac006fcba15c31938a23f8f;hpb=92468061410e9b914fc7459cade381cba5124476;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-parser.c b/gcc/c-parser.c index d12d90e6b3b..8238506b540 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. If not see #include "output.h" #include "ggc.h" #include "c-family/c-common.h" +#include "c-family/c-objc.h" #include "vec.h" #include "target.h" #include "cgraph.h" @@ -2666,11 +2667,6 @@ c_parser_typeof_specifier (c_parser *parser) error_at (here, "% applied to a bit-field"); mark_exp_read (expr.value); ret.spec = TREE_TYPE (expr.value); - if (c_dialect_objc() - && ret.spec != error_mark_node - && lookup_attribute ("objc_volatilized", TYPE_ATTRIBUTES (ret.spec))) - ret.spec = build_qualified_type - (ret.spec, (TYPE_QUALS (ret.spec) & ~TYPE_QUAL_VOLATILE)); was_vm = variably_modified_type_p (ret.spec, NULL_TREE); /* This is returned with the type so that when the type is evaluated, this can be evaluated. */ @@ -4811,8 +4807,7 @@ c_parser_for_statement (c_parser *parser) is_foreach_statement = true; if (! lvalue_p (init_expression)) c_parser_error (parser, "invalid iterating variable in fast enumeration"); - object_expression = c_process_expr_stmt (loc, init_expression); - + object_expression = c_fully_fold (init_expression, false, NULL); } else { @@ -4853,7 +4848,8 @@ c_parser_for_statement (c_parser *parser) else { if (is_foreach_statement) - collection_expression = c_process_expr_stmt (loc, c_parser_expression (parser).value); + collection_expression = c_fully_fold (c_parser_expression (parser).value, + false, NULL); else incr = c_process_expr_stmt (loc, c_parser_expression (parser).value); } @@ -6747,6 +6743,8 @@ c_parser_expr_list (c_parser *parser, bool convert_p, bool fold_p, objc-class-instance-variables[opt] @interface identifier ( identifier ) objc-protocol-refs[opt] objc-methodprotolist @end + @interface identifier ( ) objc-protocol-refs[opt] + objc-methodprotolist @end @implementation identifier ( identifier ) objc-superclass: @@ -6781,17 +6779,29 @@ c_parser_objc_class_definition (c_parser *parser, tree attributes) c_parser_consume_token (parser); if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)) { + /* We have a category or class extension. */ tree id2; tree proto = NULL_TREE; c_parser_consume_token (parser); if (c_parser_next_token_is_not (parser, CPP_NAME)) { - c_parser_error (parser, "expected identifier"); - c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); - return; + if (iface_p && c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) + { + /* We have a class extension. */ + id2 = NULL_TREE; + } + else + { + c_parser_error (parser, "expected identifier or %<)%>"); + c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); + return; + } + } + else + { + id2 = c_parser_peek_token (parser)->value; + c_parser_consume_token (parser); } - id2 = c_parser_peek_token (parser)->value; - c_parser_consume_token (parser); c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); if (!iface_p) {