re PR c/12738 (Missing function with 'static' block-scope declaration; unit-at-a-time; and IMA.)
2004-08-30 Geoffrey Keating <geoffk@apple.com> PR 12738 PR 17205 Radar 3460526 Radar 3775729 * c-decl.c (grokdeclarator): Produce error for 'static' on local function declaration. Index: testsuite/ChangeLog 2004-08-30 Geoffrey Keating <geoffk@apple.com> * gcc.dg/funcdef-storage-1.c: New. * gcc.c-torture/compile/920625-2.c: Don't use 'static' to declare an extern function in local scope. * gcc.c-torture/execute/20010605-1.c: Don't use 'static inline' to declare an 'auto inline' function in local scope. * gcc.dg/20011130-1.c: Likewise. * gcc.c-torture/execute/nest-stdar-1.c: Don't use 'static' to declare an 'auto' function in local scope. * gcc.dg/20021014-1.c: Likewise. * gcc.dg/20030331-2.c: Likewise. From-SVN: r86807
This commit is contained in:
parent
e2cad04b28
commit
ff164b22d3
@ -1,3 +1,12 @@
|
||||
2004-08-30 Geoffrey Keating <geoffk@apple.com>
|
||||
|
||||
PR 12738
|
||||
PR 17205
|
||||
Radar 3460526
|
||||
Radar 3775729
|
||||
* c-decl.c (grokdeclarator): Produce error for 'static' on local
|
||||
function declaration.
|
||||
|
||||
2004-08-30 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* expr.c (array_ref_element_size): Force aligned_size back to
|
||||
|
33
gcc/c-decl.c
33
gcc/c-decl.c
@ -4664,26 +4664,29 @@ grokdeclarator (tree declarator, tree declspecs,
|
||||
}
|
||||
else if (TREE_CODE (type) == FUNCTION_TYPE)
|
||||
{
|
||||
if (specbits & (1 << (int) RID_AUTO)
|
||||
&& (pedantic || current_scope == file_scope))
|
||||
pedwarn ("invalid storage class for function `%s'", name);
|
||||
if (specbits & (1 << (int) RID_REGISTER))
|
||||
if (specbits & (1 << (int) RID_REGISTER)
|
||||
|| specbits & (1 << (int) RID_THREAD))
|
||||
error ("invalid storage class for function `%s'", name);
|
||||
if (specbits & (1 << (int) RID_THREAD))
|
||||
error ("invalid storage class for function `%s'", name);
|
||||
/* Function declaration not at file scope.
|
||||
Storage classes other than `extern' are not allowed
|
||||
and `extern' makes no difference. */
|
||||
if (current_scope != file_scope
|
||||
&& (specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_INLINE)))
|
||||
&& pedantic)
|
||||
pedwarn ("invalid storage class for function `%s'", name);
|
||||
else if (current_scope != file_scope)
|
||||
{
|
||||
/* Function declaration not at file scope. Storage
|
||||
classes other than `extern' are not allowed, C99
|
||||
6.7.1p5, and `extern' makes no difference. However,
|
||||
GCC allows 'auto', perhaps with 'inline', to support
|
||||
nested functions. */
|
||||
if (specbits & (1 << (int) RID_AUTO))
|
||||
{
|
||||
if (pedantic)
|
||||
pedwarn ("invalid storage class for function `%s'", name);
|
||||
}
|
||||
if (specbits & (1 << (int) RID_STATIC))
|
||||
error ("invalid storage class for function `%s'", name);
|
||||
}
|
||||
|
||||
decl = build_decl (FUNCTION_DECL, declarator, type);
|
||||
decl = build_decl_attribute_variant (decl, decl_attr);
|
||||
|
||||
DECL_LANG_SPECIFIC (decl)
|
||||
= GGC_CNEW (struct lang_decl);
|
||||
DECL_LANG_SPECIFIC (decl) = GGC_CNEW (struct lang_decl);
|
||||
|
||||
if (pedantic && type_quals && ! DECL_IN_SYSTEM_HEADER (decl))
|
||||
pedwarn ("ISO C forbids qualified function types");
|
||||
|
@ -1,3 +1,16 @@
|
||||
2004-08-30 Geoffrey Keating <geoffk@apple.com>
|
||||
|
||||
* gcc.dg/funcdef-storage-1.c: New.
|
||||
* gcc.c-torture/compile/920625-2.c: Don't use 'static' to declare
|
||||
an extern function in local scope.
|
||||
* gcc.c-torture/execute/20010605-1.c: Don't use 'static inline' to
|
||||
declare an 'auto inline' function in local scope.
|
||||
* gcc.dg/20011130-1.c: Likewise.
|
||||
* gcc.c-torture/execute/nest-stdar-1.c: Don't use 'static' to declare
|
||||
an 'auto' function in local scope.
|
||||
* gcc.dg/20021014-1.c: Likewise.
|
||||
* gcc.dg/20030331-2.c: Likewise.
|
||||
|
||||
2004-08-30 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
|
||||
|
||||
* gfortran.dg/blockdata_1.f90: New test.
|
||||
|
@ -23,7 +23,7 @@ trashQueryResult(Widget w, Boolean delete, caddr_t call_data)
|
||||
|
||||
extern Cursor busy, left_ptr;
|
||||
extern String cwd;
|
||||
static void freeReturnStruct(void);
|
||||
extern void freeReturnStruct(void);
|
||||
String rmstring;
|
||||
int status;
|
||||
XedwListReturnStruct *tmp;
|
||||
@ -58,7 +58,7 @@ copyQueryResult(Widget w, Boolean copy, caddr_t call_data)
|
||||
extern void destroy_button_dialog();
|
||||
extern void changestate(Boolean);
|
||||
extern Cursor busy, left_ptr;
|
||||
static void freeReturnStruct(void);
|
||||
extern void freeReturnStruct(void);
|
||||
int execute(String, String, String, Boolean);
|
||||
extern String cwd;
|
||||
String copystring;
|
||||
|
@ -2,7 +2,7 @@ int main ()
|
||||
{
|
||||
int v = 42;
|
||||
|
||||
static inline int fff (int x)
|
||||
inline int fff (int x)
|
||||
{
|
||||
return x*10;
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
main ()
|
||||
{
|
||||
static double f (int x, ...)
|
||||
double f (int x, ...)
|
||||
{
|
||||
va_list args;
|
||||
double a;
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
static int __attribute__((unused)) foo (int x)
|
||||
{
|
||||
static inline int bar (int x)
|
||||
inline int bar (int x)
|
||||
{
|
||||
int y;
|
||||
y = x;
|
||||
|
@ -10,7 +10,7 @@ extern void exit (int);
|
||||
|
||||
int foo (void)
|
||||
{
|
||||
static int bar (int x)
|
||||
int bar (int x)
|
||||
{
|
||||
return x + 3;
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ int foo() {
|
||||
int yd;
|
||||
float in[1][yd];
|
||||
|
||||
static void bar() {
|
||||
void bar() {
|
||||
printf("%p\n",in[0]);
|
||||
}
|
||||
}
|
||||
|
14
gcc/testsuite/gcc.dg/funcdef-storage-1.c
Normal file
14
gcc/testsuite/gcc.dg/funcdef-storage-1.c
Normal file
@ -0,0 +1,14 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
void
|
||||
flarm(void)
|
||||
{
|
||||
static void foo(); /* { dg-error "invalid storage class" } */
|
||||
|
||||
foo();
|
||||
}
|
||||
|
||||
static void
|
||||
foo(void)
|
||||
{
|
||||
}
|
Loading…
Reference in New Issue
Block a user