[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 12:08:43 PDT 2015
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).
> 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()'.
> ---
> 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/20150626/bf4f01d8/attachment.sig>
More information about the mesa-dev
mailing list