Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers/net/ethernet: handle one warning explicitly

While fixing the W=1 builds, this warning came up because the
developers used a very tricky way to get structures initialized
to a non-zero value, but this causes GCC to warn about an
override. In this case the override was intentional, so just
disable the warning for this code with a kernel macro that results
in disabling the warning for compiles on GCC versions after 8.

It is not appropriate to change the struct to initialize all the
values as it will just add a lot more code for no value. The code
is completely correct as is, we just want to acknowledge that
this code could generate a warning and we're ok with that.

NOTE: the __diag_ignore macro currently only accepts a second
argument of 8 (version 80000), it's either use this one or
open code the pragma.

Fixed Warnings example (all the same):
drivers/net/ethernet/renesas/sh_eth.c:51:12: warning: initialized field overwritten [-Woverride-init]
drivers/net/ethernet/renesas/sh_eth.c:52:12: warning: initialized field overwritten [-Woverride-init]
drivers/net/ethernet/renesas/sh_eth.c:53:13: warning: initialized field overwritten [-Woverride-init]
+ 256 more...

Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jesse Brandeburg and committed by
David S. Miller
2602ddfe 553aca1c

+10
+10
drivers/net/ethernet/renesas/sh_eth.c
··· 45 45 #define SH_ETH_OFFSET_DEFAULTS \ 46 46 [0 ... SH_ETH_MAX_REGISTER_OFFSET - 1] = SH_ETH_OFFSET_INVALID 47 47 48 + /* use some intentionally tricky logic here to initialize the whole struct to 49 + * 0xffff, but then override certain fields, requiring us to indicate that we 50 + * "know" that there are overrides in this structure, and we'll need to disable 51 + * that warning from W=1 builds. GCC has supported this option since 4.2.X, but 52 + * the macros available to do this only define GCC 8. 53 + */ 54 + __diag_push(); 55 + __diag_ignore(GCC, 8, "-Woverride-init", 56 + "logic to initialize all and then override some is OK"); 48 57 static const u16 sh_eth_offset_gigabit[SH_ETH_MAX_REGISTER_OFFSET] = { 49 58 SH_ETH_OFFSET_DEFAULTS, 50 59 ··· 341 332 342 333 [TSU_ADRH0] = 0x0100, 343 334 }; 335 + __diag_pop(); 344 336 345 337 static void sh_eth_rcv_snd_disable(struct net_device *ndev); 346 338 static struct net_device_stats *sh_eth_get_stats(struct net_device *ndev);