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@xxxxxxxxx> --- parse.c | 9 +++++---- validation/c99-for-loop-decl.c | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/parse.c b/parse.c index 6ec1bab97..80f0337cc 100644 --- a/parse.c +++ b/parse.c @@ -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); diff --git a/validation/c99-for-loop-decl.c b/validation/c99-for-loop-decl.c index e813b0ae3..d382d3c9b 100644 --- a/validation/c99-for-loop-decl.c +++ b/validation/c99-for-loop-decl.c @@ -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' -- 2.11.1 -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html