On Thu, Mar 19, 2009 at 04:11:41PM -0700, Christopher Li wrote: > Thanks Al, > > I will apply it later tonight. > > If no one beats to me, I will try to add the warning for using preprocessor > directive inside macro expansion. It should be a better error message > than the current one. Well... patch below would give more or less close approximation to the current set of nasal demons produced by gcc in these situations + error when that crap happens. Warning: it might make things slower, and it needs testing. Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> --- diff --git a/pre-process.c b/pre-process.c index cf53893..df6cca4 100644 --- a/pre-process.c +++ b/pre-process.c @@ -193,13 +193,36 @@ static void expand_list(struct token **list) } } +static void preprocessor_line(struct stream *stream, struct token **line); + static struct token *collect_arg(struct token *prev, int vararg, struct position *pos) { + struct stream *stream = input_streams + prev->pos.stream; struct token **p = &prev->next; struct token *next; int nesting = 0; while (!eof_token(next = scan_next(p))) { + if (next->pos.newline && match_op(next, '#')) { + if (!next->pos.noexpand) { + sparse_error(next->pos, + "directive in argument list"); + preprocessor_line(stream, p); + __free_token(next); /* Free the '#' token */ + continue; + } + } + switch (token_type(next)) { + case TOKEN_STREAMEND: + case TOKEN_STREAMBEGIN: + *p = &eof_token_entry; + return next; + } + if (false_nesting) { + *p = next->next; + __free_token(next); + continue; + } if (match_op(next, '(')) { nesting++; } else if (match_op(next, ')')) { -- 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