Bug 4067 – [CTFE] Code inside try-catch blocks is silently ignored

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2010-04-05T05:52:00Z
Last change time
2015-06-09T05:13:46Z
Keywords
wrong-code
Assigned to
nobody
Creator
bearophile_hugs

Comments

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.
Comment #2 by bugzilla — 2010-04-28T08:31:02Z
changeset 457
Comment #3 by clugdbug — 2010-05-05T19:09:17Z
Fixed DMD2.044