aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-10-06 00:23:17 +0000
committerRichard Stallman <rms@gnu.org>1992-10-06 00:23:17 +0000
commit7a0347fff32015826a7da2704442a80979f43e10 (patch)
treec13cf491e7e5df55cdbd0f9b4be624ee8a4441df /gcc
parented7601742bab10559e7a8e0db37b8afb096d8576 (diff)
downloadgcc-7a0347fff32015826a7da2704442a80979f43e10.zip
gcc-7a0347fff32015826a7da2704442a80979f43e10.tar.gz
gcc-7a0347fff32015826a7da2704442a80979f43e10.tar.bz2
(shadow_tag_warned): Use pedwarn for useless keyword.
(pushdecl): Internally generated vars can be detected with DECL_SOURCE_LINE of zero, not DECL_IGNORED_P. (start_enum): Push obstacks, switch to permanent if global. (finish_enum): Pop obstacks. (store_parm_decls): When clearing ->names, clear out the values from the identifiers, restore shadowed values, and clear ->shadowed. (grokdeclarator): Don't warn of const or volatile function in a system header file. (start_struct): Push the obstacks. Switch to permanent if at top level. (finish_struct): Pop them. (store_parm_decls): If we have (erroneously) a prototype and old-style parm decls, throw away the old-style parm decls. (finish_decl): Do the pop_obstacks sooner, when it's time to start allocating in the ambient context's obstack. Don't call permanent_allocation unless got back to permanent obstack. (explicit_flag_signed_bitfields): New variable. (c_decode_option): Set that for -f[un]signed-bitfields. (grokdeclarator): If that's set, and -fsigned-bitfields, disregard -traditional when handling bitfield signedness. From-SVN: r2332
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-decl.c102
1 files changed, 76 insertions, 26 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index faac9a2..5e8fd43 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -428,6 +428,7 @@ int flag_traditional;
/* Nonzero means to treat bitfields as signed unless they say `unsigned'. */
int flag_signed_bitfields = 1;
+int explicit_flag_signed_bitfields = 0;
/* Nonzero means handle `#ident' directives. 0 means ignore them. */
@@ -536,14 +537,18 @@ c_decode_option (p)
flag_signed_char = 0;
else if (!strcmp (p, "-fno-unsigned-char"))
flag_signed_char = 1;
- else if (!strcmp (p, "-fsigned-bitfields"))
- flag_signed_bitfields = 1;
- else if (!strcmp (p, "-funsigned-bitfields"))
- flag_signed_bitfields = 0;
- else if (!strcmp (p, "-fno-signed-bitfields"))
- flag_signed_bitfields = 0;
- else if (!strcmp (p, "-fno-unsigned-bitfields"))
- flag_signed_bitfields = 1;
+ else if (!strcmp (p, "-fsigned-bitfields")
+ || !strcmp (p, "-fno-unsigned-bitfields"))
+ {
+ flag_signed_bitfields = 1;
+ explicit_flag_signed_bitfields = 1;
+ }
+ else if (!strcmp (p, "-funsigned-bitfields")
+ || !strcmp (p, "-fno-signed-bitfields"))
+ {
+ flag_signed_bitfields = 0;
+ explicit_flag_signed_bitfields = 1;
+ }
else if (!strcmp (p, "-fshort-enums"))
flag_short_enums = 1;
else if (!strcmp (p, "-fno-short-enums"))
@@ -2016,7 +2021,7 @@ pushdecl (x)
/* Maybe warn if shadowing something else. */
else if (warn_shadow && !DECL_EXTERNAL (x)
/* No shadow warnings for internally generated vars. */
- && !DECL_IGNORED_P (x)
+ && DECL_SOURCE_LINE (x) != 0
/* No shadow warnings for vars made for inlining. */
&& ! DECL_FROM_INLINE (x))
{
@@ -2487,10 +2492,10 @@ init_decl_processing ()
/* Define `char', which is like either `signed char' or `unsigned char'
but not the same as either. */
- char_type_node =
- (flag_signed_char
- ? make_signed_type (CHAR_TYPE_SIZE)
- : make_unsigned_type (CHAR_TYPE_SIZE));
+ char_type_node
+ = (flag_signed_char
+ ? make_signed_type (CHAR_TYPE_SIZE)
+ : make_unsigned_type (CHAR_TYPE_SIZE));
pushdecl (build_decl (TYPE_DECL, get_identifier ("char"),
char_type_node));
@@ -2982,7 +2987,7 @@ shadow_tag_warned (declspecs, warned)
else
{
if (!warned)
- warning ("useless keyword or type name in empty declaration");
+ pedwarn ("useless keyword or type name in empty declaration");
warned = 1;
}
}
@@ -3205,13 +3210,15 @@ finish_decl (decl, init, asmspec_tree)
}
}
- /* For top-level declaration, the initial value was read in
- the temporary obstack. MAXINDEX, rtl, etc. to be made below
- must go in the permanent obstack; but don't discard the
+ /* Pop back to the obstack that is current for this binding level.
+ This is because MAXINDEX, rtl, etc. to be made below
+ must go in the permanent obstack. But don't discard the
temporary data yet. */
-
+ pop_obstacks ();
+#if 0 /* pop_obstacks was near the end; this is what was here. */
if (current_binding_level == global_binding_level && temporary)
end_temporary_allocation ();
+#endif
/* Deduce size of array from initialization, if not already known */
@@ -3338,12 +3345,16 @@ finish_decl (decl, init, asmspec_tree)
DECL_INITIAL (decl) = error_mark_node;
}
+#if 0
/* Resume permanent allocation, if not within a function. */
/* The corresponding push_obstacks_nochange is in start_decl,
and in push_parm_decl and in grokfield. */
pop_obstacks ();
- if (current_binding_level == global_binding_level && temporary)
- /* Actually free the temporary space that we no longer need. */
+#endif
+
+ /* If we have gone back from temporary to permanent allocation,
+ actually free the temporary space that we no longer need. */
+ if (temporary && !allocation_temporary_p ())
permanent_allocation ();
/* At the end of a declaration, throw away any variable type sizes
@@ -3729,7 +3740,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
Optionally treat bitfields as signed by default. */
if (specbits & 1 << (int) RID_UNSIGNED
/* Traditionally, all bitfields are unsigned. */
- || (bitfield && flag_traditional)
+ || (bitfield && flag_traditional
+ && (! explicit_flag_signed_bitfields || !flag_signed_bitfields))
|| (bitfield && ! flag_signed_bitfields
&& (explicit_int || explicit_char
/* A typedef for plain `int' without `signed'
@@ -4279,7 +4291,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
decl = build_decl (FUNCTION_DECL, declarator, type);
- if (pedantic && (constp || volatilep))
+ if (pedantic && (constp || volatilep)
+ && ! DECL_IN_SYSTEM_HEADER (decl))
pedwarn ("ANSI C forbids const or volatile functions");
if (extern_ref)
@@ -4706,7 +4719,10 @@ xref_tag (code, name)
/* Make sure that the tag NAME is defined *in the current binding level*
at least as a forward reference.
- CODE says which kind of tag NAME ought to be. */
+ CODE says which kind of tag NAME ought to be.
+
+ We also do a push_obstacks_nochange
+ whose matching pop is in finish_struct. */
tree
start_struct (code, name)
@@ -4718,6 +4734,10 @@ start_struct (code, name)
register tree ref = 0;
+ push_obstacks_nochange ();
+ if (current_binding_level == global_binding_level)
+ end_temporary_allocation ();
+
if (name != 0)
ref = lookup_tag (code, name, current_binding_level, 1);
if (ref && TREE_CODE (ref) == code)
@@ -4776,7 +4796,9 @@ field_decl_cmp (x, y)
}
/* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T.
- FIELDLIST is a chain of FIELD_DECL nodes for the fields. */
+ FIELDLIST is a chain of FIELD_DECL nodes for the fields.
+
+ We also do a pop_obstacks to match the push in start_struct. */
tree
finish_struct (t, fieldlist)
@@ -5074,6 +5096,9 @@ finish_struct (t, fieldlist)
/* Finish debugging output for this type. */
rest_of_type_compilation (t, toplevel);
+ /* The matching push is in start_struct. */
+ pop_obstacks ();
+
return t;
}
@@ -5107,6 +5132,12 @@ start_enum (name)
if (name != 0)
enumtype = lookup_tag (ENUMERAL_TYPE, name, current_binding_level, 1);
+ /* The corresponding pop_obstacks is in finish_enum. */
+ push_obstacks_nochange ();
+ /* If these symbols and types are global, make them permanent. */
+ if (current_binding_level == global_binding_level)
+ end_temporary_allocation ();
+
if (enumtype == 0 || TREE_CODE (enumtype) != ENUMERAL_TYPE)
{
enumtype = make_node (ENUMERAL_TYPE);
@@ -5147,6 +5178,7 @@ finish_enum (enumtype, values)
register int i;
unsigned precision = 0;
int toplevel = global_binding_level == current_binding_level;
+ int temporary = allocation_temporary_p ();
if (in_parm_level_p ())
warning ("enum defined inside parms");
@@ -5232,6 +5264,9 @@ finish_enum (enumtype, values)
/* Finish debugging output for this type. */
rest_of_type_compilation (enumtype, toplevel);
+ /* This matches a push in start_enum. */
+ pop_obstacks ();
+
return enumtype;
}
@@ -5486,8 +5521,23 @@ store_parm_decls ()
prototype = 1;
if (parmdecls != 0)
- error_with_decl (fndecl,
- "parm types given both in parmlist and separately");
+ {
+ tree decl, link;
+
+ error_with_decl (fndecl,
+ "parm types given both in parmlist and separately");
+ /* Get rid of the erroneous decls; don't keep them on
+ the list of parms, since they might not be PARM_DECLs. */
+ for (decl = current_binding_level->names;
+ decl; decl = TREE_CHAIN (decl))
+ if (DECL_NAME (decl))
+ IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) = 0;
+ for (link = current_binding_level->shadowed;
+ link; link = TREE_CHAIN (link))
+ IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
+ current_binding_level->names = 0;
+ current_binding_level->shadowed = 0;
+ }
specparms = nreverse (specparms);
for (parm = specparms; parm; parm = next)