Instead of trying to define "struct nlattr *array;" in the all the right places, then simply define it in a block scope, as it's only used here. Before this patch it was generated for attribute set _put() functions, like wireguard_wgpeer_put(), but missing and caused a compile error for the command function wireguard_set_device(). $ make -C tools/net/ynl/generated wireguard-user.o -e CC wireguard-user.o wireguard-user.c: In function ‘wireguard_set_device’: wireguard-user.c:548:9: error: ‘array’ undeclared (first use in ..) 548 | array = ynl_attr_nest_start(nlh, WGDEVICE_A_PEERS); | ^~~~~ Signed-off-by: Asbjørn Sloth Tønnesen --- tools/net/ynl/pyynl/ynl_gen_c.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/net/ynl/pyynl/ynl_gen_c.py b/tools/net/ynl/pyynl/ynl_gen_c.py index b0eeedfca2f2..e6a84e13ec0a 100755 --- a/tools/net/ynl/pyynl/ynl_gen_c.py +++ b/tools/net/ynl/pyynl/ynl_gen_c.py @@ -842,6 +842,9 @@ class TypeArrayNest(Type): return get_lines, None, local_vars def attr_put(self, ri, var): + ri.cw.block_start() + ri.cw.p('struct nlattr *array;') + ri.cw.nl() ri.cw.p(f'array = ynl_attr_nest_start(nlh, {self.enum_name});') if self.sub_type in scalars: put_type = self.sub_type @@ -857,6 +860,7 @@ class TypeArrayNest(Type): else: raise Exception(f"Put for ArrayNest sub-type {self.attr['sub-type']} not supported, yet") ri.cw.p('ynl_attr_nest_end(nlh, array);') + ri.cw.block_end() def _setter_lines(self, ri, member, presence): return [f"{member} = {self.c_name};", @@ -2063,13 +2067,9 @@ def put_req_nested(ri, struct): init_lines.append(f"hdr = ynl_nlmsg_put_extra_header(nlh, {struct_sz});") init_lines.append(f"memcpy(hdr, &obj->_hdr, {struct_sz});") - has_anest = False has_count = False for _, arg in struct.member_list(): - has_anest |= arg.type == 'indexed-array' has_count |= arg.presence_type() == 'count' - if has_anest: - local_vars.append('struct nlattr *array;') if has_count: local_vars.append('unsigned int i;') -- 2.51.0