On Fri, Sep 26, 2014 at 05:31:48PM -0700, Behan Webster wrote: > As written, the __init for ti_clk_get_div_table is in the middle of the return > type. > > The gcc documentation indicates that section attributes should be added to the > end of the function declaration: > > extern void foobar (void) __attribute__ ((section ("bar"))); > > However gcc seems to be very permissive with where attributes can be placed. > clang on the other hand isn't so permissive, and fails if you put the section > definition in the middle of the return type: > > drivers/clk/ti/divider.c:298:28: error: expected ';' after struct > static struct clk_div_table > ^ > ; > drivers/clk/ti/divider.c:298:1: warning: 'static' ignored on this > declaration [-Wmissing-declarations] > static struct clk_div_table > ^ > drivers/clk/ti/divider.c:299:9: error: type specifier missing, > defaults to 'int' [-Werror,-Wimplicit-int] > __init *ti_clk_get_div_table(struct device_node *node) > ~~~~~~ ^ > drivers/clk/ti/divider.c:345:9: warning: incompatible pointer types > returning 'struct clk_div_table *' from a function with result type 'int *' [-Wincompatible-pointer-types] > return table; > ^~~~~ > drivers/clk/ti/divider.c:419:9: warning: incompatible pointer types > assigning to 'const struct clk_div_table *' from 'int *' [-Wincompatible-pointer-types] > *table = ti_clk_get_div_table(node); > ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~ > 3 warnings and 2 errors generated. > > By convention, most of the kernel code puts section attributes between the > return type and function name. In the case where the return type is a pointer, > it's important to place the '*' on left of the __init. > > This updated code works for both gcc and clang. > > Signed-off-by: Behan Webster <behanw@xxxxxxxxxxxxxxxxxx> > Reviewed-by: Mark Charlebois <charlebm@xxxxxxxxx> makes sense to me: Reviewed-by: Felipe Balbi <balbi@xxxxxx> I wonder if we should add this a Sparse or Coccinelle rule. -- balbi
Attachment:
signature.asc
Description: Digital signature