/**
 * taken from the dmd test suite, added options to run multiple times
 *
 * This test creates 10000 associative arrays uint[uint] multiple times
 * collecting arrays created in previous iterations.
 * A 32-bit process can be sensitive to false pointers as hash values
 * in the AAs can reference arbitrary addresses.
 */
import std.c.stdio;
import std.conv;
import std.exception;

int main(string[] args)
{
    int cnt = 4;
    int num = 200;
    if (args.length > 1)
        cnt = to!int(args[1]);
    if (args.length > 2)
        num = to!int(args[2]);
    ulong sum;
    for(int n = 0; n < cnt; n++)
    {
        uint[uint][] aa;
        aa.length = 10000;
        int aacnt = num * 10000;
        for(int i = 0; i < aacnt; i++)
        {
            size_t j = i % aa.length;
            uint k = i;
            uint l = i;
            aa[j][k] = l;
        }
        sum = 0;
        foreach(s; aa[4711])
            sum += s;
        enforce(sum == 4711 * num + 10000 * num * (num - 1) / 2);
        aa[] = null;
    }
    return 0;
}
