On Wednesday, 6 August 2014 at 13:31:54 UTC, Ola Fosheim Grøstad
wrote:
On Wednesday, 6 August 2014 at 12:41:16 UTC, Artur Skawina via
Digitalmars-d wrote:
The compiler can /assume/ that the condition never fails.
Hence, it does
not need to generate any code to check that the assumption is
valid.
Exactly, worse example using a coroutine:
«
label:
…
while(running) { // forevah!
… yield …
}
…
assume(anything local not assigned below label) // reachable,
but never executed
»
is equivalent to:
«
assume(anything local not assigned below label) // optimize
based on this
label:
…
while(running) {
… yield …
}
»
Woops?
But even if there is no explicit assert()/assume() given by the
developer, I guess the optimizer is free to insert assumes that
are provably correct, e.g.
while(running) {
...don't assign to running, don't break...
}
is equivalent to
while(running) {
...don't assign to running, don't break...
}
assume(!running);
is equivalent to
assume(!running);
while(running) {
...don't assign to running, don't break...
}
is equivalent to
assume(!running);
So I take the compiler is allowed to throw away code without any
asserts already ?