On Sat, Mar 27, 2010 at 10:16:38AM +0100, Kamil Dudka wrote: > On Wednesday 24 of March 2010 11:07:04 Christopher Li wrote: > > That is just too much. Most of the warning is coming from enum or > > operation. e.g. > > .type = KW_SPECIFIER | KW_SHORT, > > lookup_keyword(token->ident, NS_KEYWORD | NS_TYPEDEF); > > Looking once again, I don't think that's the case. The warnings do not come > from the "enum or" operation, but they come from passing the integral result > to enum variable (or arg). Instead of weaking my patch, we may improve the > code of sparse and add explicit casts back to enum: > > .type = (enum keyword) (KW_SPECIFIER | KW_SHORT), > lookup_keyword(token->ident, (enum namespace) (NS_KEYWORD | NS_TYPEDEF)); That looks wrong. .type doesn't contain a value of type "enum keyword", it contains the bitwise or of such values, which won't represent a valid enum value. Thus, .type should have an integral type, not an enum type. The same goes for the second parameter of lookup_keyword. > The whole problem can be narrowed down to a simple test-case: > > int main() > { > enum { > A = 0x1, > B = 0x2 > } val = A | B; This code seems semantically wrong, as described above. val should only have values 0x1 or 0x2, and you've assigned it 0x3, which doesn't represent a valid value of its enum type. > Here is what sparse gives: > $ ./sparse enum.c > enum.c:1:10: warning: non-ANSI function declaration of function 'main' > enum.c:6:15: warning: conversion of > enum.c:6:15: int to > enum.c:6:15: int enum <noident> > > > Here is what g++ gives: > $ g++ enum.c > enum.c: In function ‘int main()’: > enum.c:6: error: invalid conversion from ‘int’ to ‘main()::<anonymous enum>’ Yup, both of these warnings seem correct. Don't fix them by casting, fix them by declaring "val" with an appropriate integral type. - Josh Triplett -- 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