summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2023-02-08 20:52:20 +0100
committerMark Wielaard <mark@klomp.org>2023-02-09 14:12:21 +0100
commit61b99b89f5419cf5be6dd3350ad0b01caabc7447 (patch)
treea86afec5000798a9b9f032aa24f8f3057d9c82af
parentccd619eb5cf5e065173557176ba84f17bd341e5e (diff)
downloadelfutils-61b99b89f5419cf5be6dd3350ad0b01caabc7447.tar.gz
libasm: Fix xdefault_pattern initialization
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 <iii@linux.ibm.com>
-rw-r--r--libasm/asm_newscn.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/libasm/asm_newscn.c b/libasm/asm_newscn.c
index d258d969..f28c40f9 100644
--- a/libasm/asm_newscn.c
+++ b/libasm/asm_newscn.c
@@ -41,19 +41,25 @@
/* 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
+ which does work well with a static initializer. Work around this by
+ wrapping it in a union, whose second member is a char array 1 byte larger
+ than struct FillPattern. According to 6.7.9, this does what we need:
+
+ 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. */
+
+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;