Andreas Schwab <sch...@suse.de> writes:

> The problem is that assert is not allowed to evaluate the expression
> with -DNDEBUG, and side effects must not be carried out.

I'm suggesting that with -DNDEBUG, assert(x) should let the compiler
assume that x is true, but without producing any code to evaluate it at
runtime.

E.g, given

  void foo (size_t n)
  {
    size_t i;
    assert (n < 17);
    for (i = n; i < 17; i++)
      { ... }
  }

the compiler could infer that for the loop body is executed at least
once for any valid input to the function. (Where assert is used to
declare what valid inputs are like).

Then I guess one can't implement that as simply as

#define assert(x) do {if (!(x)) __builtin_unreachable() } while(0)

if that would require the compiler to generate code to evaluate x at
runtime (I'm not familiar with how __builtin_unreachable works). So one
might need something like __builtin_assume which never produces any code
to evaluate its argument at runtime.

Regarsd,
/Niels

-- 
Niels Möller. PGP-encrypted email is preferred. Keyid 368C6677.
Internet email is subject to wholesale government surveillance.

Reply via email to