Bug 6817 – [CTFE] Error on interpreting inlined IfStatement

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
All
Creation time
2011-10-16T03:55:00Z
Last change time
2011-11-02T13:07:51Z
Assigned to
nobody
Creator
code

Comments

Comment #0 by code — 2011-10-16T03:55:16Z
struct S { int bug() { bool b; void toggle() { if (b) b = false; } void trigger() { toggle(); } trigger(); return 0; } } enum interpret = S().bug(); ---- When compiling with -inline this gives the following error. bug.d(9): Error: integral constant must be scalar type, not void. This happens because the IfStatement gets rewritten to an AndAndExp during inlining. The AndAndExp is given the type void which seems reasonable as it is a statement. Later during interpretation the condition evaluates to true and an IntegerExp with AndAndExp's type (void) is created, which causes the error. I can't think of any && expression that doesn't have a bool result, so using bool for the Integer could be a fix. One thing that seems a little strange is that it is the interpretation that actually triggers inlining (through calling semantic3 on the nested function). This inverts the usual order and could possibly expose more bugs.
Comment #1 by bugzilla — 2011-11-02T13:07:51Z