On Sun, Sep 07, 2014 at 02:36:53PM +0200, Ard Biesheuvel wrote: > This code snippet: > > static void bar(void const *arg) > { > int (*foo)(void) = arg; > } > > produces the following warning: > > test.c:4:28: warning: incorrect type in initializer (different modifiers) > test.c:4:28: expected int ( *foo )( ... ) > test.c:4:28: got void const *arg > > which is caused by the fact that the function pointer 'foo' is not annotated > as being a pointer to const data. However, dereferencing a function pointer > does not produce an lvalue, so a function pointer points to const data by > definition, and we should treat it accordingly. > > Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx> As a data point: gcc does not warn about this case either, whereas it does warn about "int *foo = arg". So, this seems fine to me. Reviewed-by: Josh Triplett <josh@xxxxxxxxxxxxxxxx> > OK, so while my v1 did solve the example case, it turns out universally treating > function pointers as pointers to const data produces so much fallout that it > does more harm than good. Can you elaborate on the fallout, and ideally provide that rationale in the commit message? - 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