On Thursday, 31 July 2014 at 09:13:53 UTC, Walter Bright wrote:
On 7/31/2014 1:23 AM, Daniel Murphy wrote:
"Walter Bright" wrote in message
news:[email protected]...
5. assert(0); is equivalent to a halt, and the compiler won't
remove it.
This is not the same definition the spec gives. The spec says
assert(0) can be
treated as unreachable, and the compiler is allowed to
optimize accordingly.
It says more than that:
"The expression assert(0) is a special case; it signifies that
it is unreachable code. Either AssertError is thrown at runtime
if it is reachable, or the execution is halted (on the x86
processor, a HLT instruction can be used to halt execution).
The optimization and code generation phases of compilation may
assume that it is unreachable code."
-- http://dlang.org/expression.html#AssertExpression
You said "the compiler won't remove it".
http://dlang.org/expression.html#AssertExpression says: "The
optimization and code generation phases of compilation may assume
that it is unreachable code."
Who is right?
If I write:
---
switch(expr())
{
case 0: doIt();
case 1: doThat();
default:
assert(0);
}
---
Will the optimizer be able to remove the default: case?
Because If I use assert(0) it's on purpose and do not want it to
be elided, ever.
MSVC has __assume(0); for unreachable code, GCC has
__builtin_unreachable()