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' }; const struct FillPattern *__libasm_default_pattern = &xdefault_pattern.pattern; -- 2.39.1