https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68582
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- Probably because noreturn uses the volatile bit, TREE_THIS_VOLATILE: /* Warn about static fns or vars defined but not used. */ if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL) || (((warn_unused_variable && ! TREE_READONLY (decl)) || (warn_unused_const_variable && TREE_READONLY (decl))) && TREE_CODE (decl) == VAR_DECL)) && ! DECL_IN_SYSTEM_HEADER (decl) ... /* A volatile variable might be used in some non-obvious way. */ && ! TREE_THIS_VOLATILE (decl) this flag check should be gated on VAR_DECLs.