mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
c92a6f97df
commit
a04a722b88
|
|
@ -1,3 +1,31 @@
|
||||||
|
2011-05-05 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
* 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 <michael.hope@linaro.org>
|
2011-05-05 Michael Hope <michael.hope@linaro.org>
|
||||||
|
|
||||||
PR pch/45979
|
PR pch/45979
|
||||||
|
|
|
||||||
76
gcc/c-decl.c
76
gcc/c-decl.c
|
|
@ -1,6 +1,6 @@
|
||||||
/* Process declarations and variables for C compiler.
|
/* Process declarations and variables for C compiler.
|
||||||
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
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.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
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);
|
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. */
|
/* Install a cleanup (aka destructor) if one was given. */
|
||||||
if (TREE_CODE (decl) == VAR_DECL && !TREE_STATIC (decl))
|
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
|
tree
|
||||||
grokparm (const struct c_parm *parm)
|
grokparm (const struct c_parm *parm, tree *expr)
|
||||||
{
|
{
|
||||||
tree attrs = parm->attrs;
|
tree attrs = parm->attrs;
|
||||||
tree decl = grokdeclarator (parm->declarator, parm->specs, PARM, false,
|
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);
|
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
|
/* 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
|
void
|
||||||
push_parm_decl (const struct c_parm *parm)
|
push_parm_decl (const struct c_parm *parm, tree *expr)
|
||||||
{
|
{
|
||||||
tree attrs = parm->attrs;
|
tree attrs = parm->attrs;
|
||||||
tree decl;
|
tree decl;
|
||||||
|
|
||||||
decl = grokdeclarator (parm->declarator, parm->specs, PARM, false, NULL,
|
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_attributes (&decl, attrs, 0);
|
||||||
|
|
||||||
decl = pushdecl (decl);
|
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,
|
/* Given declspecs and a declarator,
|
||||||
determine the name and type of the object declared
|
determine the name and type of the object declared
|
||||||
and construct a ..._DECL node for it.
|
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
|
MINUS_EXPR, which allows the -1 to get folded
|
||||||
with the +1 that happens when building TYPE_SIZE. */
|
with the +1 that happens when building TYPE_SIZE. */
|
||||||
if (size_varies)
|
if (size_varies)
|
||||||
size = c_variable_size (size);
|
size = save_expr (size);
|
||||||
if (this_size_varies && TREE_CODE (size) == INTEGER_CST)
|
if (this_size_varies && TREE_CODE (size) == INTEGER_CST)
|
||||||
size = build2 (COMPOUND_EXPR, TREE_TYPE (size),
|
size = build2 (COMPOUND_EXPR, TREE_TYPE (size),
|
||||||
integer_zero_node, size);
|
integer_zero_node, size);
|
||||||
|
|
@ -5573,8 +5544,6 @@ grokdeclarator (const struct c_declarator *declarator,
|
||||||
inner layer of declarator. */
|
inner layer of declarator. */
|
||||||
arg_info = declarator->u.arg_info;
|
arg_info = declarator->u.arg_info;
|
||||||
arg_types = grokparms (arg_info, really_funcdef);
|
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
|
/* Type qualifiers before the return type of the function
|
||||||
qualify the return type, not the function type. */
|
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'.
|
This structure is later fed to 'grokparms' and 'store_parm_decls'.
|
||||||
|
|
||||||
ELLIPSIS being true means the argument list ended in '...' so don't
|
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 *
|
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_binding *b = current_scope->bindings;
|
||||||
struct c_arg_info *arg_info = build_arg_info ();
|
struct c_arg_info *arg_info = build_arg_info ();
|
||||||
|
|
@ -6444,7 +6416,7 @@ get_parm_info (bool ellipsis)
|
||||||
arg_info->tags = tags;
|
arg_info->tags = tags;
|
||||||
arg_info->types = types;
|
arg_info->types = types;
|
||||||
arg_info->others = others;
|
arg_info->others = others;
|
||||||
arg_info->pending_sizes = get_pending_sizes ();
|
arg_info->pending_sizes = expr;
|
||||||
return arg_info;
|
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
|
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
|
thus won't naturally see the SAVE_EXPR containing the increment. All
|
||||||
other pending sizes would be handled by gimplify_parameters. */
|
other pending sizes would be handled by gimplify_parameters. */
|
||||||
{
|
if (arg_info->pending_sizes)
|
||||||
VEC(tree,gc) *pending_sizes = get_pending_sizes ();
|
add_stmt (arg_info->pending_sizes);
|
||||||
tree t;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
FOR_EACH_VEC_ELT (tree, pending_sizes, i, t)
|
|
||||||
add_stmt (t);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Even though we're inside a function body, we still don't want to
|
/* 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.
|
call expand_expr to calculate the size of a variable-sized array.
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2011-05-05 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
* c-objc.h (objc_start_method_definition): Update prototype.
|
||||||
|
* stub-objc.c (objc_start_method_definition): Add extra parameter.
|
||||||
|
|
||||||
2011-05-04 Nathan Froyd <froydnj@codesourcery.com>
|
2011-05-04 Nathan Froyd <froydnj@codesourcery.com>
|
||||||
|
|
||||||
* c-common.c (check_main_parameter_types): Reindent. Don't use
|
* c-common.c (check_main_parameter_types): Reindent. Don't use
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/* Definitions of Objective-C front-end entry points used for C and C++.
|
/* Definitions of Objective-C front-end entry points used for C and C++.
|
||||||
Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998,
|
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.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
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 void objc_set_visibility (objc_ivar_visibility_kind);
|
||||||
extern tree objc_build_method_signature (bool, tree, tree, tree, bool);
|
extern tree objc_build_method_signature (bool, tree, tree, tree, bool);
|
||||||
extern void objc_add_method_declaration (bool, tree, tree);
|
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_finish_method_definition (tree);
|
||||||
extern void objc_add_instance_variable (tree);
|
extern void objc_add_instance_variable (tree);
|
||||||
extern tree objc_build_keyword_decl (tree, tree, tree, tree);
|
extern tree objc_build_keyword_decl (tree, tree, tree, tree);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
that are called from within the C and C++ front-ends,
|
that are called from within the C and C++ front-ends,
|
||||||
respectively.
|
respectively.
|
||||||
Copyright (C) 1991, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
|
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.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
|
@ -204,7 +204,8 @@ objc_add_method_declaration (bool ARG_UNUSED (is_class_method),
|
||||||
bool
|
bool
|
||||||
objc_start_method_definition (bool ARG_UNUSED (is_class_method),
|
objc_start_method_definition (bool ARG_UNUSED (is_class_method),
|
||||||
tree ARG_UNUSED (signature),
|
tree ARG_UNUSED (signature),
|
||||||
tree ARG_UNUSED (attributes))
|
tree ARG_UNUSED (attributes),
|
||||||
|
tree ARG_UNUSED (expr))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1110,7 +1110,8 @@ static struct c_declarator *c_parser_direct_declarator_inner (c_parser *,
|
||||||
bool,
|
bool,
|
||||||
struct c_declarator *);
|
struct c_declarator *);
|
||||||
static struct c_arg_info *c_parser_parms_declarator (c_parser *, bool, tree);
|
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 struct c_parm *c_parser_parameter_declaration (c_parser *, tree);
|
||||||
static tree c_parser_simple_asm_expr (c_parser *);
|
static tree c_parser_simple_asm_expr (c_parser *);
|
||||||
static tree c_parser_attributes (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_method_definition (c_parser *);
|
||||||
static void c_parser_objc_methodprotolist (c_parser *);
|
static void c_parser_objc_methodprotolist (c_parser *);
|
||||||
static void c_parser_objc_methodproto (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_type_name (c_parser *);
|
||||||
static tree c_parser_objc_protocol_refs (c_parser *);
|
static tree c_parser_objc_protocol_refs (c_parser *);
|
||||||
static void c_parser_objc_try_catch_finally_statement (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
|
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 ();
|
pop_scope ();
|
||||||
return ret;
|
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
|
/* Parse a parameter list (possibly empty), including the closing
|
||||||
parenthesis but not the opening one. ATTRS are the attributes at
|
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 *
|
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;
|
bool bad_parm = false;
|
||||||
|
|
||||||
/* ??? Following the old parser, forward parameter declarations may
|
/* ??? Following the old parser, forward parameter declarations may
|
||||||
use abstract declarators, and if no real parameter declarations
|
use abstract declarators, and if no real parameter declarations
|
||||||
follow the forward declarations then this is not diagnosed. Also
|
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)
|
if (parm == NULL)
|
||||||
bad_parm = true;
|
bad_parm = true;
|
||||||
else
|
else
|
||||||
push_parm_decl (parm);
|
push_parm_decl (parm, &expr);
|
||||||
if (c_parser_next_token_is (parser, CPP_SEMICOLON))
|
if (c_parser_next_token_is (parser, CPP_SEMICOLON))
|
||||||
{
|
{
|
||||||
tree new_attrs;
|
tree new_attrs;
|
||||||
c_parser_consume_token (parser);
|
c_parser_consume_token (parser);
|
||||||
mark_forward_parm_decls ();
|
mark_forward_parm_decls ();
|
||||||
new_attrs = c_parser_attributes (parser);
|
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))
|
if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
|
||||||
{
|
{
|
||||||
c_parser_consume_token (parser);
|
c_parser_consume_token (parser);
|
||||||
if (bad_parm)
|
if (bad_parm)
|
||||||
{
|
return NULL;
|
||||||
get_pending_sizes ();
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
return get_parm_info (false);
|
return get_parm_info (false, expr);
|
||||||
}
|
}
|
||||||
if (!c_parser_require (parser, CPP_COMMA,
|
if (!c_parser_require (parser, CPP_COMMA,
|
||||||
"expected %<;%>, %<,%> or %<)%>"))
|
"expected %<;%>, %<,%> or %<)%>"))
|
||||||
{
|
{
|
||||||
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
|
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL);
|
||||||
get_pending_sizes ();
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (c_parser_next_token_is (parser, CPP_ELLIPSIS))
|
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);
|
c_parser_consume_token (parser);
|
||||||
if (bad_parm)
|
if (bad_parm)
|
||||||
{
|
return NULL;
|
||||||
get_pending_sizes ();
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
return get_parm_info (true);
|
return get_parm_info (true, expr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
|
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
|
||||||
"expected %<)%>");
|
"expected %<)%>");
|
||||||
get_pending_sizes ();
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -7164,9 +7161,10 @@ static void
|
||||||
c_parser_objc_method_definition (c_parser *parser)
|
c_parser_objc_method_definition (c_parser *parser)
|
||||||
{
|
{
|
||||||
bool is_class_method = c_parser_objc_method_type (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;
|
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)
|
if (decl == error_mark_node)
|
||||||
return; /* Bail here. */
|
return; /* Bail here. */
|
||||||
|
|
||||||
|
|
@ -7184,7 +7182,7 @@ c_parser_objc_method_definition (c_parser *parser)
|
||||||
}
|
}
|
||||||
|
|
||||||
parser->objc_pq_context = false;
|
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));
|
add_stmt (c_parser_compound_statement (parser));
|
||||||
objc_finish_method_definition (current_function_decl);
|
objc_finish_method_definition (current_function_decl);
|
||||||
|
|
@ -7275,7 +7273,8 @@ c_parser_objc_methodproto (c_parser *parser)
|
||||||
|
|
||||||
/* Remember protocol qualifiers in prototypes. */
|
/* Remember protocol qualifiers in prototypes. */
|
||||||
parser->objc_pq_context = true;
|
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. */
|
/* Forget protocol qualifiers now. */
|
||||||
parser->objc_pq_context = false;
|
parser->objc_pq_context = false;
|
||||||
|
|
||||||
|
|
@ -7361,7 +7360,8 @@ c_parser_objc_maybe_method_attributes (c_parser* parser, tree* attributes)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static tree
|
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 type = NULL_TREE;
|
||||||
tree sel;
|
tree sel;
|
||||||
|
|
@ -7436,7 +7436,7 @@ c_parser_objc_method_decl (c_parser *parser, bool is_class_method, tree *attribu
|
||||||
if (parm == NULL)
|
if (parm == NULL)
|
||||||
break;
|
break;
|
||||||
parms = chainon (parms,
|
parms = chainon (parms,
|
||||||
build_tree_list (NULL_TREE, grokparm (parm)));
|
build_tree_list (NULL_TREE, grokparm (parm, expr)));
|
||||||
}
|
}
|
||||||
sel = list;
|
sel = list;
|
||||||
}
|
}
|
||||||
|
|
@ -7600,7 +7600,7 @@ c_parser_objc_try_catch_finally_statement (c_parser *parser)
|
||||||
if (parm == NULL)
|
if (parm == NULL)
|
||||||
parameter_declaration = error_mark_node;
|
parameter_declaration = error_mark_node;
|
||||||
else
|
else
|
||||||
parameter_declaration = grokparm (parm);
|
parameter_declaration = grokparm (parm, NULL);
|
||||||
}
|
}
|
||||||
if (seen_open_paren)
|
if (seen_open_paren)
|
||||||
c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
|
c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>");
|
||||||
|
|
|
||||||
19
gcc/c-tree.h
19
gcc/c-tree.h
|
|
@ -1,6 +1,6 @@
|
||||||
/* Definitions for C parsing and type checking.
|
/* Definitions for C parsing and type checking.
|
||||||
Copyright (C) 1987, 1993, 1994, 1995, 1997, 1998,
|
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.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
|
@ -315,11 +315,12 @@ struct c_arg_info {
|
||||||
/* A list of non-parameter decls (notably enumeration constants)
|
/* A list of non-parameter decls (notably enumeration constants)
|
||||||
defined with the parameters. */
|
defined with the parameters. */
|
||||||
tree others;
|
tree others;
|
||||||
/* A VEC of VLA sizes from the parameters. In a function
|
/* A compound expression of VLA sizes from the parameters, or NULL.
|
||||||
definition, these are used to ensure that side-effects in sizes
|
In a function definition, these are used to ensure that
|
||||||
of arrays converted to pointers (such as a parameter int i[n++])
|
side-effects in sizes of arrays converted to pointers (such as a
|
||||||
take place; otherwise, they are ignored. */
|
parameter int i[n++]) take place; otherwise, they are
|
||||||
VEC(tree,gc) *pending_sizes;
|
ignored. */
|
||||||
|
tree pending_sizes;
|
||||||
/* True when these arguments had [*]. */
|
/* True when these arguments had [*]. */
|
||||||
BOOL_BITFIELD had_vla_unspec : 1;
|
BOOL_BITFIELD had_vla_unspec : 1;
|
||||||
};
|
};
|
||||||
|
|
@ -445,17 +446,17 @@ extern void finish_function (void);
|
||||||
extern tree finish_struct (location_t, tree, tree, tree,
|
extern tree finish_struct (location_t, tree, tree, tree,
|
||||||
struct c_struct_parse_info *);
|
struct c_struct_parse_info *);
|
||||||
extern struct c_arg_info *build_arg_info (void);
|
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 *,
|
extern tree grokfield (location_t, struct c_declarator *,
|
||||||
struct c_declspecs *, tree, tree *);
|
struct c_declspecs *, tree, tree *);
|
||||||
extern tree groktypename (struct c_type_name *, tree *, bool *);
|
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 tree implicitly_declare (location_t, tree);
|
||||||
extern void keep_next_level (void);
|
extern void keep_next_level (void);
|
||||||
extern void pending_xref_error (void);
|
extern void pending_xref_error (void);
|
||||||
extern void c_push_function_context (void);
|
extern void c_push_function_context (void);
|
||||||
extern void c_pop_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 *,
|
extern struct c_declarator *set_array_declarator_inner (struct c_declarator *,
|
||||||
struct c_declarator *);
|
struct c_declarator *);
|
||||||
extern tree c_builtin_function (tree);
|
extern tree c_builtin_function (tree);
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2011-05-05 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
* parser.c (cp_parser_objc_method_definition_list): Update call to
|
||||||
|
objc_start_method_definition.
|
||||||
|
|
||||||
2011-05-04 Jason Merrill <jason@redhat.com>
|
2011-05-04 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
PR c++/48749
|
PR c++/48749
|
||||||
|
|
|
||||||
|
|
@ -22256,7 +22256,8 @@ cp_parser_objc_method_definition_list (cp_parser* parser)
|
||||||
token = cp_lexer_peek_token (parser->lexer);
|
token = cp_lexer_peek_token (parser->lexer);
|
||||||
continue;
|
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. */
|
/* For historical reasons, we accept an optional semicolon. */
|
||||||
if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
|
if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,19 @@
|
||||||
|
2011-05-05 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
* 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 <jason@redhat.com>
|
2011-04-26 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
* objc-act.c (objc_fold_objc_type_ref): Remove.
|
* objc-act.c (objc_fold_objc_type_ref): Remove.
|
||||||
|
|
|
||||||
|
|
@ -126,7 +126,7 @@ static void synth_module_prologue (void);
|
||||||
static tree start_class (enum tree_code, tree, tree, tree, tree);
|
static tree start_class (enum tree_code, tree, tree, tree, tree);
|
||||||
static tree continue_class (tree);
|
static tree continue_class (tree);
|
||||||
static void finish_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 start_protocol (enum tree_code, tree, tree, tree);
|
||||||
static tree build_method_decl (enum tree_code, tree, tree, tree, bool);
|
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
|
/* Return 'true' if the method definition could be started, and
|
||||||
'false' if not (because we are outside an @implementation context).
|
'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
|
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)
|
if (!objc_implementation_context)
|
||||||
{
|
{
|
||||||
|
|
@ -2070,7 +2073,7 @@ objc_start_method_definition (bool is_class_method, tree decl, tree attributes)
|
||||||
decl,
|
decl,
|
||||||
is_class_method,
|
is_class_method,
|
||||||
/* is optional */ false);
|
/* is optional */ false);
|
||||||
start_method_def (decl);
|
start_method_def (decl, expr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4557,7 +4560,7 @@ objc_generate_cxx_ctor_or_dtor (bool dtor)
|
||||||
? TAG_CXX_DESTRUCT
|
? TAG_CXX_DESTRUCT
|
||||||
: TAG_CXX_CONSTRUCT),
|
: TAG_CXX_CONSTRUCT),
|
||||||
make_node (TREE_LIST),
|
make_node (TREE_LIST),
|
||||||
false), NULL);
|
false), NULL, NULL_TREE);
|
||||||
body = begin_function_body ();
|
body = begin_function_body ();
|
||||||
compound_stmt = begin_compound_stmt (0);
|
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 = copy_node (decl);
|
||||||
DECL_SOURCE_LOCATION (decl) = location;
|
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);
|
body = c_begin_compound_stmt (true);
|
||||||
|
|
||||||
/* Now we need to decide how we build the getter. There are three
|
/* 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 = copy_node (decl);
|
||||||
DECL_SOURCE_LOCATION (decl) = DECL_SOURCE_LOCATION (property);
|
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);
|
body = c_begin_compound_stmt (true);
|
||||||
|
|
||||||
|
|
@ -8287,7 +8292,8 @@ objc_push_parm (tree parm)
|
||||||
|
|
||||||
#ifdef OBJCPLUS
|
#ifdef OBJCPLUS
|
||||||
tree
|
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;
|
tree parm_info = objc_parmlist;
|
||||||
objc_parmlist = NULL_TREE;
|
objc_parmlist = NULL_TREE;
|
||||||
|
|
@ -8296,7 +8302,7 @@ objc_get_parm_info (int have_ellipsis ATTRIBUTE_UNUSED)
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
struct c_arg_info *
|
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;
|
tree parm_info = objc_parmlist;
|
||||||
struct c_arg_info *arg_info;
|
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);
|
finish_decl (parm_info, input_location, NULL_TREE, NULL_TREE, NULL_TREE);
|
||||||
parm_info = next;
|
parm_info = next;
|
||||||
}
|
}
|
||||||
arg_info = get_parm_info (have_ellipsis);
|
arg_info = get_parm_info (have_ellipsis, expr);
|
||||||
pop_scope ();
|
pop_scope ();
|
||||||
objc_parmlist = NULL_TREE;
|
objc_parmlist = NULL_TREE;
|
||||||
return arg_info;
|
return arg_info;
|
||||||
|
|
@ -8348,10 +8354,12 @@ synth_self_and_ucmd_args (void)
|
||||||
|
|
||||||
/* Transform an Objective-C method definition into a static C function
|
/* Transform an Objective-C method definition into a static C function
|
||||||
definition, synthesizing the first two arguments, "self" and "_cmd",
|
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
|
static void
|
||||||
start_method_def (tree method)
|
start_method_def (tree method, tree expr)
|
||||||
{
|
{
|
||||||
tree parmlist;
|
tree parmlist;
|
||||||
#ifdef OBJCPLUS
|
#ifdef OBJCPLUS
|
||||||
|
|
@ -8406,7 +8414,7 @@ start_method_def (tree method)
|
||||||
have_ellipsis = 1;
|
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);
|
really_start_method (objc_method_context, parm_info);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -948,7 +948,7 @@ build_module_initializer_routine (void)
|
||||||
#else
|
#else
|
||||||
objc_start_function (get_identifier (TAG_GNUINIT),
|
objc_start_function (get_identifier (TAG_GNUINIT),
|
||||||
build_function_type_list (void_type_node, NULL_TREE),
|
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
|
#endif
|
||||||
body = c_begin_compound_stmt (true);
|
body = c_begin_compound_stmt (true);
|
||||||
add_stmt (build_function_call
|
add_stmt (build_function_call
|
||||||
|
|
|
||||||
|
|
@ -43,10 +43,10 @@ extern void add_class_reference (tree);
|
||||||
|
|
||||||
#ifdef OBJCPLUS
|
#ifdef OBJCPLUS
|
||||||
extern void objc_start_function (tree, tree, tree, tree);
|
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
|
#else
|
||||||
extern void objc_start_function (tree, tree, tree, struct c_arg_info *);
|
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
|
#endif
|
||||||
extern void objc_push_parm (tree);
|
extern void objc_push_parm (tree);
|
||||||
extern tree get_arg_type_list (tree, int, int);
|
extern tree get_arg_type_list (tree, int, int);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue