assume, assert, enforce, @safe

David Nadlinger via Digitalmars-d digitalmars-d at puremagic.com
Thu Jul 31 15:17:55 PDT 2014


On Thursday, 31 July 2014 at 21:25:25 UTC, Walter Bright wrote:
> On 7/31/2014 1:33 PM, David Nadlinger wrote:
>> I've had the questionable pleasure of tracking down a couple 
>> of related issues
>> in LLVM and the LDC codegen, so please take my word for it: 
>> Requiring any
>> particular behavior such as halting in a case that can be 
>> assumed to be
>> unreachable is at odds with how the term "unreachable" is used 
>> in the wild – at
>> least in projects like GCC and LLVM.
>
> For example:
>
>  int foo() {
>    while (...) {
>        ...
>    }
>    assert(0);
>  }
>
> the compiler needn't issue an error at the end "no return value 
> for foo()" because it can assume it never got there.
>
> I'll rewrite that bit in the spec as it is clearly causing 
> confusion.

Don't rewrite it because you merely concede that it might be 
confusing. Rewrite it because you admit it's contradictory. If 
you just try to reword the spec without understanding how your 
use of the terminology differs from the established meaning, 
you'll probably come up with something that is confusing to the 
rest of the world just as well.

Perhaps looking at the situation in terms of basic blocks and the 
associated control flow graph will help:

As per your above post, assert(0) has nothing to do with making 
any assumptions on the compiler side. It merely servers as a 
terminator instruction of a BB, making it a leaf in the CFG. This 
seems to be the definition you intend for the spec. Maybe add 
something along the lines of "behaves like a function call that 
never returns" as an explanation to make it easier to understand.

This is not what "unreachable" means. If assert(0) was 
unreachable, then the compiler would be free to assume that no 
CFG edges *into* the BB holding the instruction are ever taken 
(and as a corollary, it could also decide not emit any code for 
it). Thus, the term certainly shouldn't appear anywhere near 
assert(0) in the spec, except to point out the difference.

Cheers,
David


More information about the Digitalmars-d mailing list