Commit ec2343c4 by Michael Meissner

*** empty log message ***

From-SVN: r679
parent 59014d0a
...@@ -574,7 +574,7 @@ c_decode_option (p) ...@@ -574,7 +574,7 @@ c_decode_option (p)
warn_missing_prototypes = 0; warn_missing_prototypes = 0;
else if (!strcmp (p, "-Wredundant-decls")) else if (!strcmp (p, "-Wredundant-decls"))
warn_redundant_decls = 1; warn_redundant_decls = 1;
else if (!strcmp (p, "-Wnoredundant-decls")) else if (!strcmp (p, "-Wno-redundant-decls"))
warn_redundant_decls = 0; warn_redundant_decls = 0;
else if (!strcmp (p, "-Wnested-externs")) else if (!strcmp (p, "-Wnested-externs"))
warn_nested_externs = 1; warn_nested_externs = 1;
...@@ -1369,8 +1369,9 @@ duplicate_decls (newdecl, olddecl) ...@@ -1369,8 +1369,9 @@ duplicate_decls (newdecl, olddecl)
{ {
/* Since the type is OLDDECL's, make OLDDECL's size go with. */ /* Since the type is OLDDECL's, make OLDDECL's size go with. */
DECL_SIZE (newdecl) = DECL_SIZE (olddecl); DECL_SIZE (newdecl) = DECL_SIZE (olddecl);
if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl)) if (TREE_CODE (olddecl) != FUNCTION_DECL)
DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl); if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl))
DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl);
} }
/* Merge the type qualifiers. */ /* Merge the type qualifiers. */
...@@ -2562,10 +2563,7 @@ init_decl_processing () ...@@ -2562,10 +2563,7 @@ init_decl_processing ()
builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP, 0); builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP, 0);
builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY, 0); builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY, 0);
builtin_function ("strlen", sizet_ftype_string, BUILT_IN_STRLEN, 0); builtin_function ("strlen", sizet_ftype_string, BUILT_IN_STRLEN, 0);
#if 0 /* No good, since open-coded implementation fails to set errno.
The ANSI committee made a real mistake in specifying math fns. */
builtin_function ("sqrt", double_ftype_double, BUILT_IN_FSQRT, 0); builtin_function ("sqrt", double_ftype_double, BUILT_IN_FSQRT, 0);
#endif
} }
#if 0 #if 0
...@@ -3601,7 +3599,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized) ...@@ -3601,7 +3599,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
error ("size of array `%s' is negative", name); error ("size of array `%s' is negative", name);
size = integer_one_node; size = integer_one_node;
} }
itype = build_index_type (build_int_2 (TREE_INT_CST_LOW (size) - 1, 0)); itype = build_index_type (size_binop (MINUS_EXPR, size,
size_one_node));
} }
else else
{ {
...@@ -4532,8 +4531,13 @@ finish_struct (t, fieldlist) ...@@ -4532,8 +4531,13 @@ finish_struct (t, fieldlist)
} }
} }
else else
/* Non-bit-fields are aligned for their type. */ {
DECL_ALIGN (x) = MAX (DECL_ALIGN (x), TYPE_ALIGN (TREE_TYPE (x))); int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT
: TYPE_ALIGN (TREE_TYPE (x)));
/* Non-bit-fields are aligned for their type, except packed
fields which require only BITS_PER_UNIT alignment. */
DECL_ALIGN (x) = MAX (DECL_ALIGN (x), min_align);
}
} }
/* Now DECL_INITIAL is null on all members. */ /* Now DECL_INITIAL is null on all members. */
...@@ -4819,7 +4823,8 @@ finish_enum (enumtype, values) ...@@ -4819,7 +4823,8 @@ finish_enum (enumtype, values)
{ {
TREE_TYPE (TREE_PURPOSE (pair)) = enumtype; TREE_TYPE (TREE_PURPOSE (pair)) = enumtype;
DECL_SIZE (TREE_PURPOSE (pair)) = TYPE_SIZE (enumtype); DECL_SIZE (TREE_PURPOSE (pair)) = TYPE_SIZE (enumtype);
DECL_ALIGN (TREE_PURPOSE (pair)) = TYPE_ALIGN (enumtype); if (TREE_CODE (TREE_PURPOSE (pair)) != FUNCTION_DECL)
DECL_ALIGN (TREE_PURPOSE (pair)) = TYPE_ALIGN (enumtype);
} }
/* Replace the decl nodes in VALUES with their names. */ /* Replace the decl nodes in VALUES with their names. */
...@@ -5289,27 +5294,33 @@ store_parm_decls () ...@@ -5289,27 +5294,33 @@ store_parm_decls ()
} }
/* Type for passing arg must be consistent /* Type for passing arg must be consistent
with that declared for the arg. */ with that declared for the arg. */
if (! comptypes (DECL_ARG_TYPE (parm), TREE_VALUE (type)) if (! comptypes (DECL_ARG_TYPE (parm), TREE_VALUE (type)))
/* If -traditional, allow `unsigned int' instead of `int'
in the prototype. */
&& (! (flag_traditional
&& DECL_ARG_TYPE (parm) == integer_type_node
&& TREE_VALUE (type) == unsigned_type_node)))
{ {
error ("argument `%s' doesn't match function prototype", if (TREE_TYPE (parm) == TREE_VALUE (type))
IDENTIFIER_POINTER (DECL_NAME (parm)));
if (DECL_ARG_TYPE (parm) == integer_type_node
&& TREE_VALUE (type) == TREE_TYPE (parm))
{ {
error ("a formal parameter type that promotes to `int'"); /* Adjust argument to match prototype. E.g. a previous
error ("can match only `int' in the prototype"); `int foo(float);' prototype causes
} `int foo(x) float x; {...}' to be treated like
if (DECL_ARG_TYPE (parm) == double_type_node `int foo(float x) {...}'. This is particularly
&& TREE_VALUE (type) == TREE_TYPE (parm)) useful for argument types like uid_t. */
{ DECL_ARG_TYPE (parm) = TREE_TYPE (parm);
error ("a formal parameter type that promotes to `double'"); #ifdef PROMOTE_PROTOTYPES
error ("can match only `double' in the prototype"); if (TREE_CODE (TREE_TYPE (parm)) == INTEGER_TYPE
&& TYPE_PRECISION (TREE_TYPE (parm))
< TYPE_PRECISION (integer_type_node))
DECL_ARG_TYPE (parm) = integer_type_node;
#endif
if (pedantic)
warning ("promoted argument `%s' doesn't match prototype",
IDENTIFIER_POINTER (DECL_NAME (parm)));
} }
/* If -traditional, allow `int' argument to match
`unsigned' prototype. */
else if (! (flag_traditional
&& TREE_TYPE (parm) == integer_type_node
&& TREE_VALUE (type) == unsigned_type_node))
error ("argument `%s' doesn't match prototype",
IDENTIFIER_POINTER (DECL_NAME (parm)));
} }
} }
TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = 0; TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = 0;
...@@ -5653,6 +5664,9 @@ push_c_function_context () ...@@ -5653,6 +5664,9 @@ push_c_function_context ()
struct c_function *p struct c_function *p
= (struct c_function *) xmalloc (sizeof (struct c_function)); = (struct c_function *) xmalloc (sizeof (struct c_function));
if (pedantic)
pedwarn ("ANSI C forbids nested functions");
push_function_context (); push_function_context ();
p->next = c_function_chain; p->next = c_function_chain;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment