http://d.puremagic.com/issues/show_bug.cgi?id=3716
Don <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |patch --- Comment #4 from Don <[email protected]> 2010-06-24 00:00:18 PDT --- This was caused by the change in 2.037: "The type inferred from an ArrayLiteral is now a dynamic array, not a static one." typeMerge() in cast.c, needed to be modified in response, since [[]] is now of type void[][] instead of void[][0] I've patched this with a more general test for void array literals. I'm not terribly happy with the patch, the dimensionality check seems unnecessarily complicated. // TEST CASES void bug3716() { auto k1 = true ? [1,2] : []; // OK auto k2 = true ? [[1,2]] : [[]]; auto k3 = true ? [] : [[1,2]]; auto k4 = true ? [[[]]] : [[[1,2]]]; auto k5 = true ? [[[1,2]]] : [[[]]]; auto k6 = true ? [] : [[[]]]; static assert(!is(typeof(true ? [[[]]] : [[1,2]]))); // Must fail } ---------- Index: cast.c =================================================================== --- cast.c (revision 557) +++ cast.c (working copy) @@ -1499,6 +1499,30 @@ } /************************************** + * Return true if e is an empty array literal with dimensionality + * equal to or less than type of other array. + * [], [[]], [[[]]], etc. + */ +bool isVoidArrayLiteral(Expression *e, Type *other) +{ + while (e->op == TOKarrayliteral && e->type->ty == Tarray + && (((ArrayLiteralExp *)e)->elements->dim == 1)) + { + e = (Expression *)((ArrayLiteralExp *)e)->elements->data[0]; + if (other->ty == Tsarray || other->ty == Tarray) + other = other->nextOf(); + else + return false; + } + if (other->ty != Tsarray && other->ty != Tarray) + return false; + Type *t = e->type; + return (e->op == TOKarrayliteral && t->ty == Tarray && + t->nextOf()->ty == Tvoid && + ((ArrayLiteralExp *)e)->elements->dim == 0); +} + +/************************************** * Combine types. * Output: * *pt merged type, if *pt is not NULL @@ -1616,7 +1640,7 @@ else if ((t1->ty == Tsarray || t1->ty == Tarray) && (e2->op == TOKnull && t2->ty == Tpointer && t2->nextOf()->ty == Tvoid || e2->op == TOKarrayliteral && t2->ty == Tsarray && t2->nextOf()->ty == Tvoid && ((TypeSArray *)t2)->dim->toInteger() == 0 || - e2->op == TOKarrayliteral && t2->ty == Tarray && t2->nextOf()->ty == Tvoid && ((ArrayLiteralExp *)e2)->elements->dim == 0) + isVoidArrayLiteral(e2, t1)) ) { /* (T[n] op void*) => T[] * (T[] op void*) => T[] @@ -1630,7 +1654,7 @@ else if ((t2->ty == Tsarray || t2->ty == Tarray) && (e1->op == TOKnull && t1->ty == Tpointer && t1->nextOf()->ty == Tvoid || e1->op == TOKarrayliteral && t1->ty == Tsarray && t1->nextOf()->ty == Tvoid && ((TypeSArray *)t1)->dim->toInteger() == 0 || - e1->op == TOKarrayliteral && t1->ty == Tarray && t1->nextOf()->ty == Tvoid && ((ArrayLiteralExp *)e1)->elements->dim == 0) + isVoidArrayLiteral(e1, t2)) ) { /* (void* op T[n]) => T[] * (void* op T[]) => T[] -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
