https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70073
Bug ID: 70073 Summary: -Werror=return-type ignores call to function with attribute noreturn Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: douglas.bagnall at catalyst dot net.nz Target Milestone: --- GCC 6 (or more precisely, "git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233864 138bc75d-0d04-0410-961f-82ee72b054a4"), fails to compile Samba with -Werror, with this message: ../source4/heimdal/lib/hx509/sel.c: In function ‘_hx509_expr_eval’: ../source4/heimdal/lib/hx509/sel.c:180:1: error: control reaches end of non-void function [-Werror=return-type] } ^ I have failed to make a minimal testcase, but this is what is happening. In headers: #define UNREACHABLE(x) void _hx509_abort ( const char */*fmt*/, ...) __attribute__ ((noreturn, format (printf, 1, 2))); and the default case in this function triggers the error: int _hx509_expr_eval(hx509_context context, hx509_env env, struct hx_expr *expr) { switch (expr->op) { case op_TRUE: return 1; case op_FALSE: return 0; case op_NOT: return ! _hx509_expr_eval(context, env, expr->arg1); case op_AND: return _hx509_expr_eval(context, env, expr->arg1) && _hx509_expr_eval(context, env, expr->arg2); case op_OR: return _hx509_expr_eval(context, env, expr->arg1) || _hx509_expr_eval(context, env, expr->arg2); case op_COMP: return eval_comp(context, env, expr->arg1); default: _hx509_abort("hx509 eval expr with unknown op: %d", (int)expr->op); UNREACHABLE(return 0); } } As you can see, cpp converts the "UNREACHABLE(return 0)" to nothing, but GCC fails to notice that _hx509_abort() does not return. Previous versions of GCC have compiled this without trouble.