From: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> When inlining a variadic function (unsupported in general by sparse but OK when the arguments are unused and occurs as such in the kernel), the extra arguments are added in the declaration list as SYM_NODE. But these arguments can already be SYM_NODEs. Sparse doesn't support everywhere such nested nodes (they must be merged) but in this case it's fine as the node will be merged when evaluated. Add a comment telling the situation is fine. Also, move the code to where the variadic arguments are handled since the fixed one will be anyway directly overwritten. Note: Sparse doesn't really support inlining of variadic functions but is fine when the arguments are not used (and such cases occur in the kernel). Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- inline.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/inline.c b/inline.c index 0097e4bf620a..d031c9b19128 100644 --- a/inline.c +++ b/inline.c @@ -542,11 +542,15 @@ int inline_function(struct expression *expr, struct symbol *sym) FOR_EACH_PTR(arg_list, arg) { struct symbol *a = alloc_symbol(arg->pos, SYM_NODE); - a->ctype.base_type = arg->ctype; if (name) { *a = *name; set_replace(name, a); add_symbol(&fn_symbol_list, a); + } else { + // This may create a node of a node but it will + // be resolved later when the corresponding + // STMT_DECLARATION will be evaluated. + a->ctype.base_type = arg->ctype; } a->initializer = arg; add_symbol(&arg_decl, a); -- 2.36.1