Now that struct_union_enum_specifier() sets MOD_TOPLEVEL we can simplify sym_is_local(sym) and rely on it even if "sym" is type. Test-case: // copied from linux kernel # define __force __attribute__((force)) #define WRITE_ONCE(x, val) \ ({ \ union { typeof(x) __val; char __c[1]; } __u = \ { .__val = (__force typeof(x)) (val) }; \ __write_once_size(&(x), __u.__c, sizeof(x)); \ __u.__val; \ }) void func(int *p) { WRITE_ONCE(*p, 0); } before this patch the widely used WRITE_ONCE() generates a lot of spam which can't be filtered out using sym_is_local(), 11:6 def f func void ( ... ) 11:11 func def . v p int * 13:9 def s :__u 13:9 --- . v p int * 13:9 def m :__u.__val int 13:9 def m :__u.__c char [1] 13:9 func def . v __u union :__u 13:9 func -w- . v __u union :__u 13:9 func -w- m :__u.__val int 13:9 func --- . v p int * 13:9 func --r f __write_once_size bad type 13:9 func -r- . v p int * 13:9 func -r- . v __u union :__u 13:9 func m-- m :__u.__c char [1] 13:9 func --- . v p int * 13:9 func --- . v __u union :__u 13:9 func --- m :__u.__val int plus it triggers warning("no context") in test-dissect.c. With this patch the only "nonlocal" report is __write_once_size() call. Signed-off-by: Oleg Nesterov <oleg@xxxxxxxxxx> --- dissect.c | 3 ++- dissect.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dissect.c b/dissect.c index 40baf64..1465760 100644 --- a/dissect.c +++ b/dissect.c @@ -238,7 +238,8 @@ static void examine_sym_node(struct symbol *node, struct symbol *parent) return; dctx = dissect_ctx; - dissect_ctx = NULL; + if (base->ctype.modifiers & MOD_TOPLEVEL) + dissect_ctx = NULL; if (base->ident || deanon(base, name, parent)) reporter->r_symdef(base); diff --git a/dissect.h b/dissect.h index 326d3dc..38ac877 100644 --- a/dissect.h +++ b/dissect.h @@ -29,7 +29,7 @@ extern struct symbol *dissect_ctx; static inline bool sym_is_local(struct symbol *sym) { - return sym->kind == 'v' && !(sym->ctype.modifiers & MOD_TOPLEVEL); + return !(sym->ctype.modifiers & MOD_TOPLEVEL); } extern void dissect(struct reporter *, struct string_list *); -- 2.5.0