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