@@ -2890,16 +2890,17 @@ struct token *external_declaration(struct token *token, struct symbol_list **lis
for (;;) {
if (!is_typedef && match_op(token, '=')) {
- if (decl->ctype.modifiers & MOD_EXTERN) {
- warning(decl->pos, "symbol with external linkage has initializer");
- decl->ctype.modifiers &= ~MOD_EXTERN;
- }
token = initializer(&decl->initializer, token->next);
}
if (!is_typedef) {
if (validate_decl)
validate_decl(decl);
+ if (decl->initializer && decl->ctype.modifiers & MOD_EXTERN) {
+ warning(decl->pos, "symbol with external linkage has initializer");
+ decl->ctype.modifiers &= ~MOD_EXTERN;
+ }
+
if (!(decl->ctype.modifiers & (MOD_EXTERN | MOD_INLINE))) {
add_symbol(list, decl);
fn_local_symbol(decl);
@@ -32,7 +32,7 @@ static int c99(void)
* check-name: C99 for-loop declarations
*
* check-error-start
-c99-for-loop-decl.c:22:27: warning: symbol with external linkage has initializer
+c99-for-loop-decl.c:22:27: error: non-local var 'l' in for-loop initializer
c99-for-loop-decl.c:24:27: error: non-local var 'm' in for-loop initializer
c99-for-loop-decl.c:26:27: error: non-local var 'n' in for-loop initializer
c99-for-loop-decl.c:9:16: error: undefined identifier 'i'
Before the call to the method external_decl::validate_decl() there is another validation done which check if the declaration linkage is not external, otherwise an error is issued and the 'extern' is removed from the declaration. While also valid for C99 for-loop initializer, this is less desirable because in this context, 'extern' is invalid anyway and removing it from the declaration make it imposible to issue a diagnostic about it. Fix this by moving the 'extern with initializer' check after the call to validate_decl() method, where it is always pertinent and so allowing process_for_loop_decl() to make its own diagnostic. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> --- parse.c | 9 +++++---- validation/c99-for-loop-decl.c | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-)