Todd Freed <todd.freed@xxxxxxxxx> writes: > I don't know if this is a bug, but I suspect that it is. > > Consider the following two declarations, which compile fine: > > 1 static char __attribute__((weakref("LNU__strmats__LNU"))) > strmats(char* s, char* m, int* l, unsigned int options) > __attribute__((nonnull)); > 2 static char* __attribute__((weakref("LNU__strmat__LNU"))) > strmat(char* s, char* m, int* l, unsigned int options) > __attribute__((nonnull)); > > Then, if I move the 'static' keyword, like so: > > 1 char static __attribute__((weakref("LNU__strmats__LNU"))) > strmats(char* s, char* m, int* l, unsigned int options) > __attribute__((nonnull)); > 2 char* static __attribute__((weakref("LNU__strmat__LNU"))) > strmat(char* s, char* m, int* l, unsigned int options) > __attribute__((nonnull)); > > The 1st declaration still compiles, but the 2nd one fails like this: > > error.c:1: error: expected identifier or '(' before 'static' This is standard C behaviour. Storage specifiers and type specifiers may occur in any order. However, the '*' is a type declarator. A type declarator is associated with a specific name being declared. Type declarators must follow storage specifiers. In other words, the failing example above fails for the same reason that char *a, b; declares a to have type "char*" and b to have type "char". Ian