[Mesa-dev] [PATCH] nir: Make C++ more happy with NIR_SRC_INIT and NIR_DEST_INIT

Francisco Jerez currojerez at riseup.net
Fri Jun 26 15:03:50 PDT 2015


Jason Ekstrand <jason at jlekstrand.net> writes:

> On Fri, Jun 26, 2015 at 12:08 PM, Francisco Jerez <currojerez at riseup.net> wrote:
>> Jason Ekstrand <jason at 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 at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150627/6ec03de1/attachment.sig>


More information about the mesa-dev mailing list