On Tue, 2023-02-07 at 20:41 +0100, Mark Wielaard wrote: > Hi Ilya, > > On Mon, Feb 06, 2023 at 11:25:04PM +0100, Ilya Leoshkevich via > Elfutils-devel wrote: > > clang complains: > > > > asm_newscn.c:48:22: error: field 'pattern' with variable sized > > type 'struct FillPattern' not at the end of a struct or class is a > > GNU extension [-Werror,-Wgnu-variable-sized-type-not-at-end] > > struct FillPattern pattern; > > ^ > > > > Fix by using a union instead. Define the second union member to be > > a > > char array 1 byte larger than struct FillPattern. This should be > > legal > > according to 6.7.9: > > > > If an object that has static or thread storage duration is not > > initialized explicitly, then ... if it is a union, the first > > named > > member is initialized (recursively) according to these rules, > > and > > any padding is initialized to zero bits. > > > > Signed-off-by: Ilya Leoshkevich <i...@linux.ibm.com> > > --- > > libasm/asm_newscn.c | 5 ++--- > > 1 file changed, 2 insertions(+), 3 deletions(-) > > > > diff --git a/libasm/asm_newscn.c b/libasm/asm_newscn.c > > index d258d969..32a3b598 100644 > > --- a/libasm/asm_newscn.c > > +++ b/libasm/asm_newscn.c > > @@ -43,17 +43,16 @@ > > /* Memory for the default pattern. The type uses a flexible array > > which does work well with a static initializer. So we play > > some > > dirty tricks here. */ > > -static const struct > > +static const union > > { > > struct FillPattern pattern; > > - char zero; > > + char zeroes[sizeof(struct FillPattern) + 1]; > > } xdefault_pattern = > > { > > .pattern = > > { > > .len = 1 > > }, > > - .zero = '\0' > > }; > > Yes, I think this works. Could you update the comment just before > this > with some of the commit message explanation? Your explanation is much > better than "play some dirty trick" :)
Thanks, will do. > > const struct FillPattern *__libasm_default_pattern = > > &xdefault_pattern.pattern; > > I am surprised this doesn't need a cast. Do you know why? We are referencing the union's .pattern member, not the entire union, so the types still match. > > Thanks, > > Mark