On Thursday, 20 February 2014 at 17:08:11 UTC, Jakob Ovrum wrote:
On Thursday, 20 February 2014 at 13:40:38 UTC, anonymous wrote:
When the value is not needed at compile time, the optimizer
may go for it, but that's not guaranteed.
That's not really true. The optimizer will never try CTFE
because of the halting problem. Runtime is runtime,
compile-time is compile-time - they are clearly separated by
the context of the expression alone.
LDC does it. The halting problem just dictates that it can't be
done in all cases.
test.d:
---
int among(Value, Values...) (Value value, Values values)
{
foreach (i, v; values) if (value == v) return i + 1;
return 0;
}
int main()
{
return among(3, 1,2,5,3);
}
---
`ldmd2 -O -c test.d && objdump -d -M intel test.o` (excerpt):
---
0000000000000000 <_Dmain>:
0: b8 04 00 00 00 mov eax,0x4
5: c3 ret
6: 66 2e 0f 1f 84 00 00 nop WORD PTR
cs:[rax+rax*1+0x0]
d: 00 00 00
---
I.e. int main() {return 4;}