Bug 17845 – [ICE] backend\cgcod.c 1677

Status
RESOLVED
Resolution
WORKSFORME
Severity
critical
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2017-09-21T07:51:02Z
Last change time
2020-03-21T03:56:41Z
Keywords
ice
Assigned to
No Owner
Creator
MrSmith33

Comments

Comment #0 by mrsmith33 — 2017-09-21T07:51:02Z
--- void main() { struct Row { @Column!Row((ref Row r, scope SinkT s){ s("test"); }) uint fileSize; } auto formatters = parseRowInfo!Row; } alias SinkT = void delegate(const(char)[]); alias Formatter(Row) = void delegate(ref Row row, scope SinkT sink); struct Column(Row) { Formatter!Row formatter; } Formatter!Row[] parseRowInfo(Row)() { import std.traits; Formatter!Row[] formatters; static foreach(member; getSymbolsByUDA!(Row, Column!Row)) { formatters ~= getUDAs!(member, Column!Row)[0].formatter; } return formatters; } --- This is reduced case. I was trying to make this work without static in foreach, but adding static crashed the compiler. Win10 DMD 2.076 Doesn't crash on dpaste though.
Comment #1 by mrsmith33 — 2017-09-21T08:14:58Z
This crashes with the same error --- void main() { struct Row { @Column!Row((ref Row r, scope SinkT s){ s("test"); }) uint fileSize; } auto formatters = parseRowInfo!Row; } alias SinkT = void delegate(const(char)[]); alias Formatter(Row) = void delegate(ref Row row, scope SinkT sink); struct Column(Row) { Formatter!Row formatter; } Formatter!Row[] parseRowInfo(Row)() { import std.traits; Formatter!Row[] formatters; alias symbols = getSymbolsByUDA!(Row, Column!Row); foreach(i; 0..symbols.length) { formatters ~= getUDAs!(symbols, Column!Row)[0].formatter; } return formatters; } ---
Comment #2 by mrsmith33 — 2017-09-21T09:13:38Z
Looks like the problem is with the use of delegate. When switching to function it works. --- void main() { struct Row { @Column!Row((ref Row r, scope SinkT s){ s("test"); }) uint fileSize; } auto formatters = parseRowInfo!Row; } alias SinkT = void delegate(const(char)[]); // Internal error: ddmd\backend\cgcod.c 1677 when function -> delegate alias Formatter(Row) = void function(ref Row row, scope SinkT sink); struct Column(Row) { Formatter!Row formatter; } Formatter!Row[] parseRowInfo(Row)() { import std.traits; Formatter!Row[] formatters; Row r; foreach(string memberName; __traits(allMembers, Row)) { foreach(attr; __traits(getAttributes, __traits(getMember, r, memberName))) { static if (is(typeof(attr) == Column!Row)) { formatters ~= attr.formatter; } } } return formatters; } ---
Comment #3 by b2.temp — 2019-05-31T10:34:35Z
All platform were affected, it was fixed since 2.072.2 : https://run.dlang.io/is/ppM9hz