On 08/06/14 18:00, via Digitalmars-d wrote:
I am quite confident that assume(false) anywhere in your program is basically stating that the program is unsound (true==false) and should not be compiled and run at all.

No, an assume(false) in a program only means that every _path_
_leading_to_that_statement is 'unsound'. For practical purposes
it's better to treat 'unsound' as impossible and unreachable.

IOW

    import std.stdio, std.array;
    int main(string[] argv) {
       if (argv.length<2)
          assume(0);
       if (argv.length==1)
          writeln("help text");
       return argv.empty;
    }

=>

0000000000403890 <_Dmain>:
   403890:       31 c0                   xor    %eax,%eax
   403892:       c3                      retq


The alternatives would be to make it either: a) always a compile
error, or b) always a runtime error. The former would add little
value (`static assert` already exists); the latter is already
available as `assert(0)`.
The above example after "s/assume(0)/assert(0)/" becomes:

0000000000403890 <_Dmain>:
   403890:       48 83 ff 01             cmp    $0x1,%rdi
403894: 76 03 jbe 403899 <_Dmain+0x9>
   403896:       31 c0                   xor    %eax,%eax
   403898:       c3                      retq
   403899:       50                      push   %rax
   40389a:       e8 71 e7 ff ff          callq  402010 <abort@plt>

IOW the compiler can still optimize based on the (un)reachability,
but the behavior in no longer undefined.

artur

Reply via email to