From 5c2219772a300ca26cab1e71f8d4d73f34cf1ff0 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 15 Oct 2022 23:37:38 -0700 Subject: args: don't use C99 flexible array member. The reason is that args_decl_list places struct args inside a larger struct, where it is followed by another member. A struct with a flexible array being other than the last member of another struct is a GNU extension, which generates warnings on newer GCC versions. * args.h (struct args): Define arg as array of [1] rather than [FLEX_ARRAY]. (ARGS_ABS_MIN): Unconditionally define as 1. (args_decl_list): Subtract 1 from N because we get one element from struct args. This macro should have subtracted the FLEX_ARRAY value. --- args.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/args.h b/args.h index df8cb3db..cc6f5f61 100644 --- a/args.h +++ b/args.h @@ -30,7 +30,7 @@ struct args { cnum argc; cnum fill; val list; - val arg[FLEX_ARRAY]; + val arg[1]; /* deliberate disuse of FLEX_ARRAY */ }; typedef int arg_index; @@ -38,11 +38,7 @@ typedef int arg_index; #define ARGS_MAX 32 #define ARGS_MIN 4 -#if FLEX_ARRAY + 0 == 1 #define ARGS_ABS_MIN 1 -#else -#define ARGS_ABS_MIN 0 -#endif struct args_bool_key { val key; @@ -64,7 +60,7 @@ INLINE void args_set_fill(struct args *args, cnum fill) } #define args_decl_list(NAME, N, L) \ - struct { struct args args; val arg[N]; } _ac; \ + struct { struct args args; val arg[(N) - 1]; } _ac; \ struct args *NAME = args_init_list(&_ac.args, N, L) #define args_decl_constsize(NAME, N) args_decl_list(NAME, N, nil) -- cgit v1.2.3