Uwe Kleine-König <u.kleine-koe...@pengutronix.de> writes: > in the linux kernel I defined a function as follows: > > static struct platform_device *__init __maybe_unused > imx_add_imx_dma(void) > { > ... > } > > and the only used was #ifdefed out. > > With the following defines: > > #define __section(S) __attribute__ ((__section__(#S))) > #define __cold __attribute__((__cold__)) > #define notrace __attribute__((no_instrument_function)) > #define __init __section(.init.text) __cold notrace > #define __maybe_unused __attribute__((unused)) > > this still generated the "defined but unused" warning. > > Then after changing the definition to > > static struct platform_device __init __maybe_unused > *imx_add_imx_dma(void) > > (i.e. move the * after the attribute stuff) the warning is gone. In > both cases (and when the function was used) it is put in the > ".init.text" section though. That is in the first case __init worked, > but __maybe_unused did not. Is this intended? Do I something wrong? > What is the most correct position for function attributes for functions > returning a pointer? > > (I'm using gcc 4.3.2 for arm, OSELAS.Toolchain-1.99.3.6 here. Could not > reproduce with Debian's gcc 4.4.5 for x86 using a minimal example.)
This message is not appropriate for the mailing list g...@gcc.gnu.org. It would be appropriate for gcc-h...@gcc.gnu.org. Please take any followups to gcc-help. Thanks. The syntax for attributes is documented at http://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/Attribute-Syntax.html . I think the differences you are seeing are because some attributes can apply to types and some can only apply to declarations. Moving the location of the __attribute__ affects which type it applies to. In particular __attribute__ ((unused)) may be used with a type, but __attribute__ ((section (...))) may only be used with a declaration. Ian