aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-02-27 19:08:53 +0000
committerRichard Stallman <rms@gnu.org>1993-02-27 19:08:53 +0000
commit89d7540d7bd16a0b664be710db1159f5e8763572 (patch)
treee1ec765bbede30f0588e913fdeb1883c1846171e /gcc
parentcacb38243ebe742e49bbc89ce2320733b44a4fc0 (diff)
downloadgcc-89d7540d7bd16a0b664be710db1159f5e8763572.zip
gcc-89d7540d7bd16a0b664be710db1159f5e8763572.tar.gz
gcc-89d7540d7bd16a0b664be710db1159f5e8763572.tar.bz2
(pushdecl): Nested fn decl gets DECL_CONTEXT iff not extern.
(grokdeclarator): Make `long long' work even with -pedantic, despite the warning. (declare_parm_level): Unconditionally store 1. (pushdecl): Criterion for no warning is, next level up is a parm level. From-SVN: r3555
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c-decl.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 4ff5f3e..6045476 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -318,7 +318,6 @@ struct binding_level
struct binding_level *level_chain;
/* Nonzero for the level that holds the parameters of a function. */
- /* 2 for a definition, 1 for a declaration. */
char parm_flag;
/* Nonzero if this level "doesn't exist" for tags. */
@@ -740,13 +739,15 @@ kept_level_p ()
}
/* Identify this binding level as a level of parameters.
- DEFINITION_FLAG is 1 for a definition, 0 for a declaration. */
+ DEFINITION_FLAG is 1 for a definition, 0 for a declaration.
+ But it turns out there is no way to pass the right value for
+ DEFINITION_FLAG, so we ignore it. */
void
declare_parm_level (definition_flag)
int definition_flag;
{
- current_binding_level->parm_flag = 1 + definition_flag;
+ current_binding_level->parm_flag = 1;
}
/* Nonzero if currently making parm declarations. */
@@ -1718,8 +1719,11 @@ pushdecl (x)
register struct binding_level *b = current_binding_level;
DECL_CONTEXT (x) = current_function_decl;
- /* A local declaration for a function doesn't constitute nesting. */
- if (TREE_CODE (x) == FUNCTION_DECL && DECL_INITIAL (x) == 0)
+ /* A local extern declaration for a function doesn't constitute nesting.
+ A local auto declaration does, since it's a forward decl
+ for a nested function coming later. */
+ if (TREE_CODE (x) == FUNCTION_DECL && DECL_INITIAL (x) == 0
+ && DECL_EXTERNAL (x))
DECL_CONTEXT (x) = 0;
if (warn_nested_externs && DECL_EXTERNAL (x) && b != global_binding_level
@@ -2072,8 +2076,12 @@ pushdecl (x)
char *warnstring = 0;
if (TREE_CODE (x) == PARM_DECL
- && current_binding_level->parm_flag == 1)
- /* Don't warn about the parm names in a declaration. */
+ && current_binding_level->level_chain->parm_flag)
+ /* Don't warn about the parm names in function declarator
+ within a function declarator.
+ It would be nice to avoid warning in any function
+ declarator in a declaration, as opposed to a definition,
+ but there is no way to tell it's not a definition. */
;
else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
warnstring = "declaration of `%s' shadows a parameter";
@@ -3693,12 +3701,14 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
{
if (i == (int) RID_LONG && specbits & (1<<i))
{
- if (pedantic)
- pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id));
- else if (longlong)
+ if (longlong)
error ("`long long long' is too long for GCC");
else
- longlong = 1;
+ {
+ if (pedantic)
+ pedwarn ("ANSI C does not support `long long'");
+ longlong = 1;
+ }
}
else if (specbits & (1 << i))
pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id));
@@ -5846,7 +5856,7 @@ store_parm_decls ()
DECL_ARG_TYPE (parm) = integer_type_node;
#endif
if (pedantic)
- warning ("promoted argument `%s' doesn't match prototype",
+ pedwarn ("promoted argument `%s' doesn't match prototype",
IDENTIFIER_POINTER (DECL_NAME (parm)));
}
/* If -traditional, allow `int' argument to match