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:
Geoffrey Keating 2004-08-30 22:19:24 +00:00 committed by Geoffrey Keating
parent e2cad04b28
commit ff164b22d3
10 changed files with 61 additions and 22 deletions

View File

@ -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

View File

@ -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");

View File

@ -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.

View File

@ -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;

View File

@ -2,7 +2,7 @@ int main ()
{
int v = 42;
static inline int fff (int x)
inline int fff (int x)
{
return x*10;
}

View File

@ -2,7 +2,7 @@
main ()
{
static double f (int x, ...)
double f (int x, ...)
{
va_list args;
double a;

View File

@ -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;

View File

@ -10,7 +10,7 @@ extern void exit (int);
int foo (void)
{
static int bar (int x)
int bar (int x)
{
return x + 3;
}

View File

@ -6,7 +6,7 @@ int foo() {
int yd;
float in[1][yd];
static void bar() {
void bar() {
printf("%p\n",in[0]);
}
}

View File

@ -0,0 +1,14 @@
/* { dg-do compile } */
void
flarm(void)
{
static void foo(); /* { dg-error "invalid storage class" } */
foo();
}
static void
foo(void)
{
}