// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s typedef void(fatal_fun)() __attribute__((__noreturn__)); fatal_fun* fatal_fptr; void fatal_decl() __attribute__((__noreturn__)); int rng(); /// This code calls a [[noreturn]] function pointer, which used to be handled /// inconsistently between AST builder and CSA. /// In the result, CSA produces a path where this function returns non-0. int return_zero_or_abort_by_fnptr() { if (rng()) fatal_fptr(); return 0; } /// This function calls a [[noreturn]] function. /// If it does return, it always returns 0. int return_zero_or_abort_by_direct_fun() { if (rng()) fatal_decl(); return 0; } /// Trigger a division by zero issue depending on the return value /// of the called functions. int caller() { int x = 0; // The following if branches must never be taken. if (return_zero_or_abort_by_fnptr()) return 1 / x; // no-warning: Dead code. if (return_zero_or_abort_by_direct_fun()) return 1 / x; // no-warning: Dead code. // Make sure the warning is still reported when viable. return 1 / x; // expected-warning {{Division by zero}} }