Jason Ekstrand <ja...@jlekstrand.net> writes: > On Fri, Jun 26, 2015 at 12:08 PM, Francisco Jerez <curroje...@riseup.net> > wrote: >> Jason Ekstrand <ja...@jlekstrand.net> writes: >> >>> In C, if you partially initialize a structure, the rest of the struct gets >>> set to 0. C++, however, does not have this rule so GCC throws warnings >>> whenver NIR_SRC_INIT or NIR_DEST_INIT is used in C++. >> >> I don't think that's right, in C++ initializers missing from an >> aggregate initializer list are also defined to be initialized >> (value-initialized to be more precise, what would set them to zero in >> this case just like in C). > > Yes, that is correct. I just did a second attempt that, instead, > defines a static const variable named NIR_SRC_INIT with a partial > initializer. C++ still gets grumpy and gives me a pile of "missing > initializer" warnings. > That's likely related to the warning flags you have enabled in CXXFLAGS, not to C++ itself. Maybe you have -Wmissing-field-initializers enabled for C++ only?
>>> Since nir.h contains a static inline that uses NIR_SRC_INIT, every C++ >>> file that includes nir.h complains about this. >>> >> I suspect the reason why this causes a warning may be that you're using >> compound literals? (which are a C99-specific feature and not part of C++) >> >>> This patch adds a small static inline function that makes a struct, >>> memsets it to 0, and returns it. NIR_SRC_INIT and NIR_DEST_INIT are then >>> wrappers around this function. >> >> In C++ you could just call the implicitly defined default constructor >> for nir_src or nir_dest, like 'nir_src()'. > > The implicitly defined default constructor does nothing to POD types, > so doing so would explicitly *not* perform the desired action of > zeroing out the data. > Indeed, but 'nir_src()' doesn't only call the implicitly-defined trivial default constructor, it value-initializes the object (See section 8.5/8 of the C++14 spec) what for POD types causes all members to be zero-initialized. >>> --- >>> src/glsl/nir/nir.h | 22 ++++++++++++++++++++++ >>> 1 file changed, 22 insertions(+) >>> >>> diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h >>> index c666d93..3634f30 100644 >>> --- a/src/glsl/nir/nir.h >>> +++ b/src/glsl/nir/nir.h >>> @@ -511,7 +511,18 @@ typedef struct nir_src { >>> bool is_ssa; >>> } nir_src; >>> >>> +#ifdef __cplusplus >>> +static inline nir_src >>> +__nir_src_init(void) >>> +{ >>> + nir_src src; >>> + memset(&src, 0, sizeof(src)); >>> + return src; >>> +} >>> +#define NIR_SRC_INIT (__nir_src_init()) >>> +#else >>> #define NIR_SRC_INIT (nir_src) { { NULL } } >>> +#endif >>> >>> #define nir_foreach_use(reg_or_ssa_def, src) \ >>> list_for_each_entry(nir_src, src, &(reg_or_ssa_def)->uses, use_link) >>> @@ -534,7 +545,18 @@ typedef struct { >>> bool is_ssa; >>> } nir_dest; >>> >>> +#ifdef __cplusplus >>> +static inline nir_dest >>> +__nir_dest_init(void) >>> +{ >>> + nir_dest dest; >>> + memset(&dest, 0, sizeof(dest)); >>> + return dest; >>> +} >>> +#define NIR_DEST_INIT (__nir_dest_init()) >>> +#else >>> #define NIR_DEST_INIT (nir_dest) { { { NULL } } } >>> +#endif >>> >>> #define nir_foreach_def(reg, dest) \ >>> list_for_each_entry(nir_dest, dest, &(reg)->defs, reg.def_link) >>> -- >>> 2.4.3 >>> >>> _______________________________________________ >>> mesa-dev mailing list >>> mesa-dev@lists.freedesktop.org >>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev