Comment #0 by bearophile_hugs — 2010-04-05T05:52:22Z
Usually I show here minimal programs that contain the bug, but this time I show a bigger small program.
This is a small benchmark I've adapted from the old Shootout code, it tests the performance of exceptions (on dmd they are very slow).
I use this code both at compile time and run time.
It contains a printf and exceptions that can't be used in CTFE, but this program compiles with dmd v.2.042 and prints 0/0 at ctfe.
import std.c.stdio: printf;
class LoException : Exception {
this() {
super(null);
}
}
class HiException : Exception {
this() {
super(null);
}
}
struct HiLo { int hi, lo; }
struct App {
int hi, lo, count;
void someFunction() {
try {
hiFunction();
} catch (Exception e) {
printf("We shouldn't get here\n");
}
}
void hiFunction() {
try {
loFunction();
} catch (HiException) {
hi++;
}
}
void loFunction() {
try {
blowUp();
} catch (LoException) {
lo++;
}
}
void blowUp() {
if (count & 1)
throw new HiException();
else
throw new LoException();
}
auto go(int n) {
for (count = 0; count < n; count++)
someFunction();
return HiLo(hi, lo);
}
}
void main() {
enum int n = 1000;
App app;
HiLo result1 = app.go(n); // OK
printf("excepts(%d) hi|lo = %d | %d\n", n, result1.hi, result1.lo);
enum HiLo result2 = app.go(n); // Err
printf("excepts(%d) hi|lo = %d | %d\n", n, result2.hi, result2.lo);
}
Comment #1 by clugdbug — 2010-04-06T06:30:42Z
This should generate an error, until exceptions are supported in CTFE.