I took another pass, and this works for me: diff --git a/parse.c b/parse.c index ca4726b8..44c59707 100644 --- a/parse.c +++ b/parse.c @@ -2859,6 +2859,7 @@ struct token *external_declaration(struct token *token, struct symbol_list **lis /* Parse declaration-specifiers, if any */ token = declaration_specifiers(token, &ctx); mod = storage_modifiers(&ctx); + mod |= ctx.ctype.modifiers & MOD_NORETURN; decl = alloc_symbol(token->pos, SYM_NODE); /* Just a type declaration? */ if (match_op(token, ';')) { (I suppose a proper fix would collate all function-level attributes but...) However, it seems like smatch is still not quite passing its knowledge along: if I have: extern void die() __attribute((__noreturn__)); void mydie() { die(); } then the die() call is nullified, but smatch doesn't realise that means all paths of mydie() are __noreturn__ too. regards john