From a04a722b88baf5568f3ba02a07189cbd65b0dc22 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Thu, 5 May 2011 11:20:31 +0100 Subject: [PATCH] c-decl.c (finish_decl): Don't call get_pending_sizes. * c-decl.c (finish_decl): Don't call get_pending_sizes. (grokparm): Add parameter expr. Pass it to grokdeclarator. (push_parm_decl): Add parameter expr. Pass it to grokdeclarator. (c_variable_size): Remove. (grokdeclarator): Use save_expr instead of c_variable_size. Don't call put_pending_sizes. (get_parm_info): Add parameter expr. Use it to set arg_info->pending_sizes. (store_parm_decls): Use arg_info->pending_sizes instead or calling get_pending_sizes. * c-parser.c (c_parser_parms_declarator): Update call to c_parser_parms_list_declarator. (c_parser_parms_list_declarator): Take parameter expr. Update call to push_parm_decl. Update recursive call. Don't call get_pending_sizes. Update calls to get_parm_info. (c_parser_objc_method_definition): Update calls to c_parser_objc_method_decl and objc_start_method_definition. (c_parser_objc_methodproto): Update call to c_parser_objc_method_decl. (c_parser_objc_method_decl): Add parameter expr. Update call to grokparm. (c_parser_objc_try_catch_finally_statement): Update call to grokparm. * c-tree.h (struct c_arg_info.pending_sizes): Change to a tree. (get_parm_info, grokparm, push_parm_decl): Update prototypes. c-family: * c-objc.h (objc_start_method_definition): Update prototype. * stub-objc.c (objc_start_method_definition): Add extra parameter. cp: * parser.c (cp_parser_objc_method_definition_list): Update call to objc_start_method_definition. objc: * objc-act.c (objc_start_method_definition): Add parameter expr. Update call to start_method_def. (objc_generate_cxx_ctor_or_dtor, objc_synthesize_getter, objc_synthesize_setter) Update calls to objc_start_method_definition. (objc_get_parm_info): Add parameter expr. Update call to get_parm_info. (start_method_def): Add parameter expr. Update call to objc_get_parm_info. * objc-gnu-runtime-abi-01.c (build_module_initializer_routine): Update call to objc_get_parm_info. * objc-runtime-shared-support.h (objc_get_parm_info): Add extra parameter. From-SVN: r173422 --- gcc/ChangeLog | 28 ++++++++++ gcc/c-decl.c | 76 +++++++------------------- gcc/c-family/ChangeLog | 5 ++ gcc/c-family/c-objc.h | 4 +- gcc/c-family/stub-objc.c | 5 +- gcc/c-parser.c | 52 +++++++++--------- gcc/c-tree.h | 19 ++++--- gcc/cp/ChangeLog | 5 ++ gcc/cp/parser.c | 3 +- gcc/objc/ChangeLog | 16 ++++++ gcc/objc/objc-act.c | 32 +++++++---- gcc/objc/objc-gnu-runtime-abi-01.c | 2 +- gcc/objc/objc-runtime-shared-support.h | 4 +- 13 files changed, 141 insertions(+), 110 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8ca49a51ae5..e127a736e55 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,31 @@ +2011-05-05 Joseph Myers + + * c-decl.c (finish_decl): Don't call get_pending_sizes. + (grokparm): Add parameter expr. Pass it to grokdeclarator. + (push_parm_decl): Add parameter expr. Pass it to grokdeclarator. + (c_variable_size): Remove. + (grokdeclarator): Use save_expr instead of c_variable_size. Don't + call put_pending_sizes. + (get_parm_info): Add parameter expr. Use it to set + arg_info->pending_sizes. + (store_parm_decls): Use arg_info->pending_sizes instead or calling + get_pending_sizes. + * c-parser.c (c_parser_parms_declarator): Update call to + c_parser_parms_list_declarator. + (c_parser_parms_list_declarator): Take parameter expr. Update + call to push_parm_decl. Update recursive call. Don't call + get_pending_sizes. Update calls to get_parm_info. + (c_parser_objc_method_definition): Update calls to + c_parser_objc_method_decl and objc_start_method_definition. + (c_parser_objc_methodproto): Update call to + c_parser_objc_method_decl. + (c_parser_objc_method_decl): Add parameter expr. Update call to + grokparm. + (c_parser_objc_try_catch_finally_statement): Update call to + grokparm. + * c-tree.h (struct c_arg_info.pending_sizes): Change to a tree. + (get_parm_info, grokparm, push_parm_decl): Update prototypes. + 2011-05-05 Michael Hope PR pch/45979 diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 9b217d26de5..6bc09489214 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -1,6 +1,6 @@ /* Process declarations and variables for C compiler. Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of GCC. @@ -4428,12 +4428,6 @@ finish_decl (tree decl, location_t init_loc, tree init, rest_of_decl_compilation (decl, DECL_FILE_SCOPE_P (decl), 0); } - /* At the end of a declaration, throw away any variable type sizes - of types defined inside that declaration. There is no use - computing them in the following function definition. */ - if (current_scope == file_scope) - get_pending_sizes (); - /* Install a cleanup (aka destructor) if one was given. */ if (TREE_CODE (decl) == VAR_DECL && !TREE_STATIC (decl)) { @@ -4478,14 +4472,17 @@ finish_decl (tree decl, location_t init_loc, tree init, } } -/* Given a parsed parameter declaration, decode it into a PARM_DECL. */ +/* Given a parsed parameter declaration, decode it into a PARM_DECL. + EXPR is NULL or a pointer to an expression that needs to be + evaluated for the side effects of array size expressions in the + parameters. */ tree -grokparm (const struct c_parm *parm) +grokparm (const struct c_parm *parm, tree *expr) { tree attrs = parm->attrs; tree decl = grokdeclarator (parm->declarator, parm->specs, PARM, false, - NULL, &attrs, NULL, NULL, DEPRECATED_NORMAL); + NULL, &attrs, expr, NULL, DEPRECATED_NORMAL); decl_attributes (&decl, attrs, 0); @@ -4493,16 +4490,18 @@ grokparm (const struct c_parm *parm) } /* Given a parsed parameter declaration, decode it into a PARM_DECL - and push that on the current scope. */ + and push that on the current scope. EXPR is a pointer to an + expression that needs to be evaluated for the side effects of array + size expressions in the parameters. */ void -push_parm_decl (const struct c_parm *parm) +push_parm_decl (const struct c_parm *parm, tree *expr) { tree attrs = parm->attrs; tree decl; decl = grokdeclarator (parm->declarator, parm->specs, PARM, false, NULL, - &attrs, NULL, NULL, DEPRECATED_NORMAL); + &attrs, expr, NULL, DEPRECATED_NORMAL); decl_attributes (&decl, attrs, 0); decl = pushdecl (decl); @@ -4789,34 +4788,6 @@ warn_variable_length_array (tree name, tree size) } } -/* Given a size SIZE that may not be a constant, return a SAVE_EXPR to - serve as the actual size-expression for a type or decl. This is - like variable_size in stor-layout.c, but we make global_bindings_p - return negative to avoid calls to that function from outside the - front end resulting in errors at file scope, then call this version - instead from front-end code. */ - -static tree -c_variable_size (tree size) -{ - tree save; - - if (TREE_CONSTANT (size)) - return size; - - size = save_expr (size); - - save = skip_simple_arithmetic (size); - - if (cfun && cfun->dont_save_pending_sizes_p) - return size; - - if (!global_bindings_p ()) - put_pending_size (save); - - return size; -} - /* Given declspecs and a declarator, determine the name and type of the object declared and construct a ..._DECL node for it. @@ -5354,7 +5325,7 @@ grokdeclarator (const struct c_declarator *declarator, MINUS_EXPR, which allows the -1 to get folded with the +1 that happens when building TYPE_SIZE. */ if (size_varies) - size = c_variable_size (size); + size = save_expr (size); if (this_size_varies && TREE_CODE (size) == INTEGER_CST) size = build2 (COMPOUND_EXPR, TREE_TYPE (size), integer_zero_node, size); @@ -5573,8 +5544,6 @@ grokdeclarator (const struct c_declarator *declarator, inner layer of declarator. */ arg_info = declarator->u.arg_info; arg_types = grokparms (arg_info, really_funcdef); - if (really_funcdef) - put_pending_sizes (arg_info->pending_sizes); /* Type qualifiers before the return type of the function qualify the return type, not the function type. */ @@ -6265,10 +6234,13 @@ build_arg_info (void) This structure is later fed to 'grokparms' and 'store_parm_decls'. ELLIPSIS being true means the argument list ended in '...' so don't - append a sentinel (void_list_node) to the end of the type-list. */ + append a sentinel (void_list_node) to the end of the type-list. + + EXPR is NULL or an expression that needs to be evaluated for the + side effects of array size expressions in the parameters. */ struct c_arg_info * -get_parm_info (bool ellipsis) +get_parm_info (bool ellipsis, tree expr) { struct c_binding *b = current_scope->bindings; struct c_arg_info *arg_info = build_arg_info (); @@ -6444,7 +6416,7 @@ get_parm_info (bool ellipsis) arg_info->tags = tags; arg_info->types = types; arg_info->others = others; - arg_info->pending_sizes = get_pending_sizes (); + arg_info->pending_sizes = expr; return arg_info; } @@ -8199,14 +8171,8 @@ store_parm_decls (void) because we throw away the array type in favor of a pointer type, and thus won't naturally see the SAVE_EXPR containing the increment. All other pending sizes would be handled by gimplify_parameters. */ - { - VEC(tree,gc) *pending_sizes = get_pending_sizes (); - tree t; - int i; - - FOR_EACH_VEC_ELT (tree, pending_sizes, i, t) - add_stmt (t); - } + if (arg_info->pending_sizes) + add_stmt (arg_info->pending_sizes); /* Even though we're inside a function body, we still don't want to call expand_expr to calculate the size of a variable-sized array. diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 55c03b30ddf..d3edc6cdd74 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2011-05-05 Joseph Myers + + * c-objc.h (objc_start_method_definition): Update prototype. + * stub-objc.c (objc_start_method_definition): Add extra parameter. + 2011-05-04 Nathan Froyd * c-common.c (check_main_parameter_types): Reindent. Don't use diff --git a/gcc/c-family/c-objc.h b/gcc/c-family/c-objc.h index 33e9f9d66f1..b32c5962a05 100644 --- a/gcc/c-family/c-objc.h +++ b/gcc/c-family/c-objc.h @@ -1,6 +1,6 @@ /* Definitions of Objective-C front-end entry points used for C and C++. Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of GCC. @@ -75,7 +75,7 @@ extern void objc_finish_implementation (void); extern void objc_set_visibility (objc_ivar_visibility_kind); extern tree objc_build_method_signature (bool, tree, tree, tree, bool); extern void objc_add_method_declaration (bool, tree, tree); -extern bool objc_start_method_definition (bool, tree, tree); +extern bool objc_start_method_definition (bool, tree, tree, tree); extern void objc_finish_method_definition (tree); extern void objc_add_instance_variable (tree); extern tree objc_build_keyword_decl (tree, tree, tree, tree); diff --git a/gcc/c-family/stub-objc.c b/gcc/c-family/stub-objc.c index 26ea3c87dab..3dacac5b0e2 100644 --- a/gcc/c-family/stub-objc.c +++ b/gcc/c-family/stub-objc.c @@ -2,7 +2,7 @@ that are called from within the C and C++ front-ends, respectively. Copyright (C) 1991, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, - 2004, 2005, 2007, 2009, 2010 Free Software Foundation, Inc. + 2004, 2005, 2007, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of GCC. @@ -204,7 +204,8 @@ objc_add_method_declaration (bool ARG_UNUSED (is_class_method), bool objc_start_method_definition (bool ARG_UNUSED (is_class_method), tree ARG_UNUSED (signature), - tree ARG_UNUSED (attributes)) + tree ARG_UNUSED (attributes), + tree ARG_UNUSED (expr)) { return true; } diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 698a080d452..241bc381675 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -1110,7 +1110,8 @@ static struct c_declarator *c_parser_direct_declarator_inner (c_parser *, bool, struct c_declarator *); static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree); -static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree); +static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree, + tree); static struct c_parm *c_parser_parameter_declaration (c_parser *, tree); static tree c_parser_simple_asm_expr (c_parser *); static tree c_parser_attributes (c_parser *); @@ -1173,7 +1174,7 @@ static bool c_parser_objc_method_type (c_parser *); static void c_parser_objc_method_definition (c_parser *); static void c_parser_objc_methodprotolist (c_parser *); static void c_parser_objc_methodproto (c_parser *); -static tree c_parser_objc_method_decl (c_parser *, bool, tree *); +static tree c_parser_objc_method_decl (c_parser *, bool, tree *, tree *); static tree c_parser_objc_type_name (c_parser *); static tree c_parser_objc_protocol_refs (c_parser *); static void c_parser_objc_try_catch_finally_statement (c_parser *); @@ -3101,7 +3102,8 @@ c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs) } else { - struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs); + struct c_arg_info *ret = c_parser_parms_list_declarator (parser, attrs, + NULL); pop_scope (); return ret; } @@ -3109,12 +3111,15 @@ c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs) /* Parse a parameter list (possibly empty), including the closing parenthesis but not the opening one. ATTRS are the attributes at - the start of the list. */ + the start of the list. EXPR is NULL or an expression that needs to + be evaluated for the side effects of array size expressions in the + parameters. */ static struct c_arg_info * -c_parser_parms_list_declarator (c_parser *parser, tree attrs) +c_parser_parms_list_declarator (c_parser *parser, tree attrs, tree expr) { bool bad_parm = false; + /* ??? Following the old parser, forward parameter declarations may use abstract declarators, and if no real parameter declarations follow the forward declarations then this is not diagnosed. Also @@ -3158,31 +3163,27 @@ c_parser_parms_list_declarator (c_parser *parser, tree attrs) if (parm == NULL) bad_parm = true; else - push_parm_decl (parm); + push_parm_decl (parm, &expr); if (c_parser_next_token_is (parser, CPP_SEMICOLON)) { tree new_attrs; c_parser_consume_token (parser); mark_forward_parm_decls (); new_attrs = c_parser_attributes (parser); - return c_parser_parms_list_declarator (parser, new_attrs); + return c_parser_parms_list_declarator (parser, new_attrs, expr); } if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) { c_parser_consume_token (parser); if (bad_parm) - { - get_pending_sizes (); - return NULL; - } + return NULL; else - return get_parm_info (false); + return get_parm_info (false, expr); } if (!c_parser_require (parser, CPP_COMMA, "expected %<;%>, %<,%> or %<)%>")) { c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); - get_pending_sizes (); return NULL; } if (c_parser_next_token_is (parser, CPP_ELLIPSIS)) @@ -3192,18 +3193,14 @@ c_parser_parms_list_declarator (c_parser *parser, tree attrs) { c_parser_consume_token (parser); if (bad_parm) - { - get_pending_sizes (); - return NULL; - } + return NULL; else - return get_parm_info (true); + return get_parm_info (true, expr); } else { c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>"); - get_pending_sizes (); return NULL; } } @@ -7164,9 +7161,10 @@ static void c_parser_objc_method_definition (c_parser *parser) { bool is_class_method = c_parser_objc_method_type (parser); - tree decl, attributes = NULL_TREE; + tree decl, attributes = NULL_TREE, expr = NULL_TREE; parser->objc_pq_context = true; - decl = c_parser_objc_method_decl (parser, is_class_method, &attributes); + decl = c_parser_objc_method_decl (parser, is_class_method, &attributes, + &expr); if (decl == error_mark_node) return; /* Bail here. */ @@ -7184,7 +7182,7 @@ c_parser_objc_method_definition (c_parser *parser) } parser->objc_pq_context = false; - if (objc_start_method_definition (is_class_method, decl, attributes)) + if (objc_start_method_definition (is_class_method, decl, attributes, expr)) { add_stmt (c_parser_compound_statement (parser)); objc_finish_method_definition (current_function_decl); @@ -7275,7 +7273,8 @@ c_parser_objc_methodproto (c_parser *parser) /* Remember protocol qualifiers in prototypes. */ parser->objc_pq_context = true; - decl = c_parser_objc_method_decl (parser, is_class_method, &attributes); + decl = c_parser_objc_method_decl (parser, is_class_method, &attributes, + NULL); /* Forget protocol qualifiers now. */ parser->objc_pq_context = false; @@ -7361,7 +7360,8 @@ c_parser_objc_maybe_method_attributes (c_parser* parser, tree* attributes) */ static tree -c_parser_objc_method_decl (c_parser *parser, bool is_class_method, tree *attributes) +c_parser_objc_method_decl (c_parser *parser, bool is_class_method, + tree *attributes, tree *expr) { tree type = NULL_TREE; tree sel; @@ -7436,7 +7436,7 @@ c_parser_objc_method_decl (c_parser *parser, bool is_class_method, tree *attribu if (parm == NULL) break; parms = chainon (parms, - build_tree_list (NULL_TREE, grokparm (parm))); + build_tree_list (NULL_TREE, grokparm (parm, expr))); } sel = list; } @@ -7600,7 +7600,7 @@ c_parser_objc_try_catch_finally_statement (c_parser *parser) if (parm == NULL) parameter_declaration = error_mark_node; else - parameter_declaration = grokparm (parm); + parameter_declaration = grokparm (parm, NULL); } if (seen_open_paren) c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"); diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 8e883624270..97a4e55cd12 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -1,6 +1,6 @@ /* Definitions for C parsing and type checking. Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. This file is part of GCC. @@ -315,11 +315,12 @@ struct c_arg_info { /* A list of non-parameter decls (notably enumeration constants) defined with the parameters. */ tree others; - /* A VEC of VLA sizes from the parameters. In a function - definition, these are used to ensure that side-effects in sizes - of arrays converted to pointers (such as a parameter int i[n++]) - take place; otherwise, they are ignored. */ - VEC(tree,gc) *pending_sizes; + /* A compound expression of VLA sizes from the parameters, or NULL. + In a function definition, these are used to ensure that + side-effects in sizes of arrays converted to pointers (such as a + parameter int i[n++]) take place; otherwise, they are + ignored. */ + tree pending_sizes; /* True when these arguments had [*]. */ BOOL_BITFIELD had_vla_unspec : 1; }; @@ -445,17 +446,17 @@ extern void finish_function (void); extern tree finish_struct (location_t, tree, tree, tree, struct c_struct_parse_info *); extern struct c_arg_info *build_arg_info (void); -extern struct c_arg_info *get_parm_info (bool); +extern struct c_arg_info *get_parm_info (bool, tree); extern tree grokfield (location_t, struct c_declarator *, struct c_declspecs *, tree, tree *); extern tree groktypename (struct c_type_name *, tree *, bool *); -extern tree grokparm (const struct c_parm *); +extern tree grokparm (const struct c_parm *, tree *); extern tree implicitly_declare (location_t, tree); extern void keep_next_level (void); extern void pending_xref_error (void); extern void c_push_function_context (void); extern void c_pop_function_context (void); -extern void push_parm_decl (const struct c_parm *); +extern void push_parm_decl (const struct c_parm *, tree *); extern struct c_declarator *set_array_declarator_inner (struct c_declarator *, struct c_declarator *); extern tree c_builtin_function (tree); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ae3ac934fa0..7586ea61b39 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2011-05-05 Joseph Myers + + * parser.c (cp_parser_objc_method_definition_list): Update call to + objc_start_method_definition. + 2011-05-04 Jason Merrill PR c++/48749 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9ec571e793c..82495b65c0a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -22256,7 +22256,8 @@ cp_parser_objc_method_definition_list (cp_parser* parser) token = cp_lexer_peek_token (parser->lexer); continue; } - objc_start_method_definition (is_class_method, sig, attribute); + objc_start_method_definition (is_class_method, sig, attribute, + NULL_TREE); /* For historical reasons, we accept an optional semicolon. */ if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)) diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index f31a75419a9..8706175d277 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,19 @@ +2011-05-05 Joseph Myers + + * objc-act.c (objc_start_method_definition): Add parameter expr. + Update call to start_method_def. + (objc_generate_cxx_ctor_or_dtor, objc_synthesize_getter, + objc_synthesize_setter) Update calls to + objc_start_method_definition. + (objc_get_parm_info): Add parameter expr. Update call to + get_parm_info. + (start_method_def): Add parameter expr. Update call to + objc_get_parm_info. + * objc-gnu-runtime-abi-01.c (build_module_initializer_routine): + Update call to objc_get_parm_info. + * objc-runtime-shared-support.h (objc_get_parm_info): Add extra + parameter. + 2011-04-26 Jason Merrill * objc-act.c (objc_fold_objc_type_ref): Remove. diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 025f37544f9..46cfc554b61 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -126,7 +126,7 @@ static void synth_module_prologue (void); static tree start_class (enum tree_code, tree, tree, tree, tree); static tree continue_class (tree); static void finish_class (tree); -static void start_method_def (tree); +static void start_method_def (tree, tree); static tree start_protocol (enum tree_code, tree, tree, tree); static tree build_method_decl (enum tree_code, tree, tree, tree, bool); @@ -2041,9 +2041,12 @@ objc_add_method_declaration (bool is_class_method, tree decl, tree attributes) /* Return 'true' if the method definition could be started, and 'false' if not (because we are outside an @implementation context). + EXPR is NULL or an expression that needs to be evaluated for the + side effects of array size expressions in the parameters. */ bool -objc_start_method_definition (bool is_class_method, tree decl, tree attributes) +objc_start_method_definition (bool is_class_method, tree decl, tree attributes, + tree expr) { if (!objc_implementation_context) { @@ -2070,7 +2073,7 @@ objc_start_method_definition (bool is_class_method, tree decl, tree attributes) decl, is_class_method, /* is optional */ false); - start_method_def (decl); + start_method_def (decl, expr); return true; } @@ -4557,7 +4560,7 @@ objc_generate_cxx_ctor_or_dtor (bool dtor) ? TAG_CXX_DESTRUCT : TAG_CXX_CONSTRUCT), make_node (TREE_LIST), - false), NULL); + false), NULL, NULL_TREE); body = begin_function_body (); compound_stmt = begin_compound_stmt (0); @@ -7214,7 +7217,8 @@ objc_synthesize_getter (tree klass, tree class_methods ATTRIBUTE_UNUSED, tree pr decl = copy_node (decl); DECL_SOURCE_LOCATION (decl) = location; - objc_start_method_definition (false /* is_class_method */, decl, NULL_TREE); + objc_start_method_definition (false /* is_class_method */, decl, NULL_TREE, + NULL_TREE); body = c_begin_compound_stmt (true); /* Now we need to decide how we build the getter. There are three @@ -7393,7 +7397,8 @@ objc_synthesize_setter (tree klass, tree class_methods ATTRIBUTE_UNUSED, tree pr decl = copy_node (decl); DECL_SOURCE_LOCATION (decl) = DECL_SOURCE_LOCATION (property); - objc_start_method_definition (false /* is_class_method */, decl, NULL_TREE); + objc_start_method_definition (false /* is_class_method */, decl, NULL_TREE, + NULL_TREE); body = c_begin_compound_stmt (true); @@ -8287,7 +8292,8 @@ objc_push_parm (tree parm) #ifdef OBJCPLUS tree -objc_get_parm_info (int have_ellipsis ATTRIBUTE_UNUSED) +objc_get_parm_info (int have_ellipsis ATTRIBUTE_UNUSED, + tree expr ATTRIBUTE_UNUSED) { tree parm_info = objc_parmlist; objc_parmlist = NULL_TREE; @@ -8296,7 +8302,7 @@ objc_get_parm_info (int have_ellipsis ATTRIBUTE_UNUSED) } #else struct c_arg_info * -objc_get_parm_info (int have_ellipsis) +objc_get_parm_info (int have_ellipsis, tree expr) { tree parm_info = objc_parmlist; struct c_arg_info *arg_info; @@ -8313,7 +8319,7 @@ objc_get_parm_info (int have_ellipsis) finish_decl (parm_info, input_location, NULL_TREE, NULL_TREE, NULL_TREE); parm_info = next; } - arg_info = get_parm_info (have_ellipsis); + arg_info = get_parm_info (have_ellipsis, expr); pop_scope (); objc_parmlist = NULL_TREE; return arg_info; @@ -8348,10 +8354,12 @@ synth_self_and_ucmd_args (void) /* Transform an Objective-C method definition into a static C function definition, synthesizing the first two arguments, "self" and "_cmd", - in the process. */ + in the process. EXPR is NULL or an expression that needs to be + evaluated for the side effects of array size expressions in the + parameters. */ static void -start_method_def (tree method) +start_method_def (tree method, tree expr) { tree parmlist; #ifdef OBJCPLUS @@ -8406,7 +8414,7 @@ start_method_def (tree method) have_ellipsis = 1; } - parm_info = objc_get_parm_info (have_ellipsis); + parm_info = objc_get_parm_info (have_ellipsis, expr); really_start_method (objc_method_context, parm_info); } diff --git a/gcc/objc/objc-gnu-runtime-abi-01.c b/gcc/objc/objc-gnu-runtime-abi-01.c index fdeebea18c4..863f7d66cdf 100644 --- a/gcc/objc/objc-gnu-runtime-abi-01.c +++ b/gcc/objc/objc-gnu-runtime-abi-01.c @@ -948,7 +948,7 @@ build_module_initializer_routine (void) #else objc_start_function (get_identifier (TAG_GNUINIT), build_function_type_list (void_type_node, NULL_TREE), - NULL_TREE, objc_get_parm_info (0)); + NULL_TREE, objc_get_parm_info (0, NULL_TREE)); #endif body = c_begin_compound_stmt (true); add_stmt (build_function_call diff --git a/gcc/objc/objc-runtime-shared-support.h b/gcc/objc/objc-runtime-shared-support.h index ace9039552a..c948cfdba98 100644 --- a/gcc/objc/objc-runtime-shared-support.h +++ b/gcc/objc/objc-runtime-shared-support.h @@ -43,10 +43,10 @@ extern void add_class_reference (tree); #ifdef OBJCPLUS extern void objc_start_function (tree, tree, tree, tree); -extern tree objc_get_parm_info (int); +extern tree objc_get_parm_info (int, tree); #else extern void objc_start_function (tree, tree, tree, struct c_arg_info *); -extern struct c_arg_info *objc_get_parm_info (int); +extern struct c_arg_info *objc_get_parm_info (int, tree); #endif extern void objc_push_parm (tree); extern tree get_arg_type_list (tree, int, int); -- 2.30.2