Trying to compile the following program crashes DMD (from current Git, a47637): --- import std.typecons; enum foo = tuple("foo", tuple("bar")); --- The backtrace from GDB: --- Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_PROTECTION_FAILURE at address: 0x00000011 0x00087246 in expandTuples () (gdb) bt #0 0x00087246 in expandTuples () #1 0x0012c6a9 in TupleExp::interpret () #2 0x0012963d in ExpStatement::interpret () #3 0x00129696 in CompoundStatement::interpret () #4 0x00129696 in CompoundStatement::interpret () #5 0x0012f44a in FuncDeclaration::interpret () #6 0x0012fb73 in CallExp::interpret () #7 0x000dfcc7 in CallExp::optimize () #8 0x000b7c28 in ExpInitializer::semantic () #9 0x000574b1 in VarDeclaration::semantic2 () #10 0x000c6912 in Module::semantic2 () #11 0x000c4388 in main () --- The above backtrace seems to indicate a bug in CTFE. Indeed, if the value isn't computed at compile time, everything works fine: --- import std.stdio; import std.typecons; void main() { auto foo = tuple("foo", tuple("bar")); writeln(foo); // prints Tuple!(string,Tuple!(string))(foo, Tuple!(string)(bar)). } ---
Reduced test case. It happens with compile time assignment to a tuple which contains an object with an opAssign. Not a regression, failed in 2.040 as well. struct S5676 { int x; void opAssign(S5676 rhs) { x = rhs.x;} } struct Tup5676(E...) { E g; void foo(E values) { g = values; } } bool ice5676() { Tup5676!(S5676) q; q.foo( S5676(3) ); assert( q.g[0].x == 3); // crashes here return true; } static assert(ice5676());
https://github.com/D-Programming-Language/dmd/commit/766ff55baceec3a8d00d23ece02ff4aadc6b9209
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル