D issues are now
tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Summary: |
[CTFE] Code inside try-catch blocks is silently ignored |
Product: |
D
|
Reporter: |
bearophile_hugs |
Component: |
dmd | Assignee: |
No Owner <nobody> |
Status: |
RESOLVED
FIXED
|
Severity: |
normal
|
CC: |
bugzilla, clugdbug
|
Priority: |
P2
|
Keywords: |
wrong-code |
Version: |
D2 |
Hardware: |
x86 |
OS: |
Windows |
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);
}
This should generate an error, until exceptions are supported in CTFE.
Comment 2
Walter Bright
2010年04月28日 08:31:02 UTC
changeset 457