mirror of
https://github.com/Z3Prover/z3
synced 2026-08-03 04:33:28 +00:00
Fix remaining clang warnings for fallthrough switch cases (in debug build). (#10314)
https://github.com/Z3Prover/z3/pull/10284 changed the UNREACHABLE macro in debug.h to use __builtin_unreachable() to indicate to the compiler that the code leading it should be considered unreachable. In https://github.com/Z3Prover/z3/pull/10295 Copilot figured out that this was wrong: the unreachable macro makes calls, which shouldn't be elided, and whose arguments should be evaluated. It partially fixed the problem by declaring invoke_exit_action to be `[[noreturn]]`. This eliminated warnings in non-debug builds, but when Z3_DEBUG is enabled, `UNREACHABLE` ends with an invocation of `INVOKE_DEBUGER()`. This can call `invoke_debugger()`, which *can* actually return (so it can't be given the `[[noreturn]]` attribute. So we still get warnings in debug builds. This PR fixes those, creating a Z3_unreachable_case macro, which is just a combination of `UNREACHABLE()` and `Z3_fallthrough`. It uses that in the places that give warnings. It seemed better to me to still have these cases have a single macro, rather than `UNREACHABLE` followed by an explicit `Z3_fallthrough`; this seemed to me like it would confuse people -- "how can you fall through if this code is unreachable?" But I'm open to alternative suggestions!
This commit is contained in:
parent
141e99ffe7
commit
c49eb07c3e
6 changed files with 11 additions and 5 deletions
|
|
@ -123,7 +123,7 @@ sexpr * const * sexpr::get_children() const {
|
|||
void sexpr::display_atom(std::ostream & out) const {
|
||||
switch (get_kind()) {
|
||||
case sexpr::kind_t::COMPOSITE:
|
||||
UNREACHABLE();
|
||||
Z3_unreachable_case();
|
||||
case sexpr::kind_t::NUMERAL:
|
||||
out << static_cast<sexpr_numeral const *>(this)->m_val;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -80,6 +80,12 @@ static_assert(sizeof(int64_t) == 8, "64 bits");
|
|||
# define Z3_fallthrough
|
||||
#endif
|
||||
|
||||
// UNREACHABLE is not defined in a way that makes it clear to the compiler
|
||||
// that it does not return (because it calls INVOKE_DEBUGGER() in debug builds,
|
||||
// and that *may* return). Using this for unreachable switch cases avoids
|
||||
// any fall-through warnings.
|
||||
#define Z3_unreachable_case() UNREACHABLE(); Z3_fallthrough
|
||||
|
||||
static inline bool is_power_of_two(unsigned v) { return !(v & (v - 1)) && v; }
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue