}
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))
- error ("invalid storage class for function `%s'", name);
- if (specbits & (1 << (int) RID_THREAD))
+ if (specbits & (1 << (int) RID_REGISTER)
+ || 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");
+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.
extern Cursor busy, left_ptr;
extern String cwd;
- static void freeReturnStruct(void);
+ extern void freeReturnStruct(void);
String rmstring;
int status;
XedwListReturnStruct *tmp;
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;