On Sat, Jan 13, 2018 at 08:14:06PM +0100, Thomas Monjalon wrote: > Hi, > > There is a new compilation error since this commit in LPM: > http://dpdk.org/commit/b2e1c99 > The brace has been removed because unnecessary with anonymous union. > > This union is declared with RTE_STD_C11 for compatibility > with old compilers: > /** C extension macro for environments lacking C11 features. */ > #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L > #define RTE_STD_C11 __extension__ > > #else > #define RTE_STD_C11 > #endif
Yes, however not only for old compilers, e.g. explicitly specifying -std=c99 on the command-line disables C11 extensions for newer compilers as well. Not specifying anything (like most applications do) simply defaults to whatever standard is deemed "current" for it. In short, RTE_STD_C11 gets expanded as __extension__ when the compiler isn't in C11 mode, and what follows is therefore an extension to the standard in use (be it C90 or C99). __extension__ remains explicitly used in place of RTE_STD_C11 for things that are not even found in C11, namely GNU syntax extensions fall under this category. Keep in mind the __extension__ keyword is itself a GNU extension. > Unfortunately, it does not work on Suse 11 SP2 with GCC 4.5.1: > lib/librte_lpm/rte_lpm.c: In function ‘add_depth_big_v20’: > lib/librte_lpm/rte_lpm.c:886:4: error: > unknown field ‘group_idx’ specified in initializer > > Curiously, the error is exactly the same with ICC 16.0.2: > http://dpdk.org/ml/archives/test-report/2018-January/038443.html > Is it really using different compilers in those 2 tests? > > Someone to check the value of __STDC_VERSION__ with those compilers? > gcc -dM -E -xc /dev/null | grep STDC_VERSION > > Thanks for the help Since this problem only appears in big endian, my suggestion would be to add RTE_STD_C11 to the anonymous union of struct rte_lpm_tbl_entry_v20 (rte_lpm.h), like its little endian counterpart: #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN [...] RTE_STD_C11 union { uint8_t next_hop; uint8_t group_idx; }; [...] #else __extension__ struct rte_lpm_tbl_entry_v20 { uint8_t depth :6; uint8_t valid_group :1; uint8_t valid :1; RTE_STD_C11 // <<< Should be added here union { uint8_t group_idx; uint8_t next_hop; }; }; I don't have the adequate test environment to validate this, so please report if it helps and/or submit a patch, thanks. -- Adrien Mazarguil 6WIND