[dmd-internals] CTFE problem - need debugging hint
Kai Nacke
kai.nacke at redstar.de
Wed Jan 2 08:44:21 PST 2013
Hi!
While trying to port LDC to PPC64 I ran into the following CTFE issue.
This small program (reduced from std.conv.to!string(int)):
import core.stdc.stdio : printf;
string toStr()
{
char x[];
x.length = 16;
x[0..3] = "666";
x.length = 3;
return cast(string) x;
}
string gencode()
{
return "int x = " ~ toStr ~ ";";
}
void main()
{
mixin(gencode());
printf("Value of gencode: |%s|\n", gencode().ptr);
}
produces the error:
bug2.d(19): Error: expression expected, not 'EOF'
bug2.d(19): Error: semicolon expected, not 'EOF'
(the mixin statement is in line 19)
From the log I conclude that it must have something to do with the
split range and array join:
bug2.d(8) VarExp::interpret() x
REF ASSIGN: x=['6', '6', '6']
ARRAY LITERAL type=char[] 0x10011b59040:
void
void
void
bug2.d(9) ReturnStatement::interpret(cast(string)x)
bug2.d(9) CastExp::interpret() cast(string)x
bug2.d(9) VarExp::interpret() x
RETURN bug2.d(9)
ARRAY LITERAL type=char[] 0x10011b59040:
void
void
void
bug2.d(4) -CompoundStatement::interpret() 0x10011b59040
-CompoundStatement::interpret() 0x10011b59040
bug2.d(14) StringExp::interpret() ";"
RETURN bug2.d(14)
STRING "int x = \x00\x00\x00;" 0x10011b593c0
-CompoundStatement::interpret() 0x10011b593e0
Needless to say that it works on x86 with dmd (2.061) and on x86_64 with
ldc2 (based on 2.060).
The error does not show up if I (a) replace the mixin statement with
mixin("int x = " ~ toStr ~ ";") or (b) do a return "666" in toStr().
Does anybody have a hint how I can reduce this further? E.g. is there a
way to view the content of the array?
Thanks in advance.
Kai
More information about the dmd-internals
mailing list