Bug 12850 – ICE when passing associative array to template
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2014-06-04T04:50:00Z
Last change time
2014-06-08T00:24:15Z
Keywords
ice, pull
Assigned to
nobody
Creator
monkeyworks12
Comments
Comment #0 by monkeyworks12 — 2014-06-04T04:50:41Z
Comment #1 by monkeyworks12 — 2014-06-04T04:54:09Z
The error given is:
dmd: interpret.c:310: static int CompiledCtfeFunction::walkAllVars(Expression*, void*): Assertion `0' failed.
When I pass an associative array of type int[Index!5] as an alias to a template. The code is too long to paste here, see the dpaste link for the smallest example I could create.
http://dpaste.dzfl.pl/b2918df47beb
Comment #2 by k.hara.pg — 2014-06-07T15:22:26Z
Please paste case code directly, or attach the source file.
// From http://dpaste.dzfl.pl/b2918df47beb
template toTypeTuple(alias range)
{
import std.range : isInputRange;
import std.traits : isArray, isNarrowString;
import std.typetuple: TypeTuple;
alias Arr = typeof(range);
static if (isArray!Arr && !isNarrowString!Arr)
{
static if (range.length == 0)
{
alias toTypeTuple = TypeTuple!();
}
else static if (range.length == 1)
{
alias toTypeTuple = TypeTuple!(range[0]);
}
else
{
alias toTypeTuple = TypeTuple!(toTypeTuple!(range[0 .. $/2]), toTypeTuple!(range[$/2 .. $]));
}
}
else static if (isInputRange!Arr)
{
import std.array : array;
alias toTypeTuple = toTypeTuple!(array(range));
}
else
{
import std.string : format;
static assert (0, format("Cannot transform %s of type %s into a TypeTuple.", range, Arr.stringof));
}
}
template staticZip(alias values, Indices...)
{
import std.typetuple;
template Pair(T...)
if (T.length == 2)
{
alias Pair = TypeTuple!(T);
}
static if (Indices.length == 1 && values.length == 1)
{
alias staticZip = TypeTuple!(Pair!(Indices[0], values[0]));
}
else
{
alias staticZip = TypeTuple!(Pair!(Indices[0], values[0]), staticZip!(Indices[1..$], values[1..$]));
}
}
struct Index(int upperBound)
if (upperBound > 0)
{
import std.range;
enum range = toTypeTuple!(iota(upperBound));
enum length = range.length;
alias rangeType = typeof(range[0]);
alias rangeType this;
}
alias N = Index!5;
void main()
{
import std.typetuple;
int[N] arr;
pragma(msg, staticZip!(arr, N));
}