From 2070e8e1386ad03d1d77d7beff910bfca31a8aad Mon Sep 17 00:00:00 2001 From: k-hara Date: Sun, 6 Sep 2015 21:39:10 +0900 Subject: [PATCH] fix Issue 14996 - only(EnumMembers!T) eats all my memory when T : string --- src/todt.c | 15 +++++++----- test/runnable/structlit.d | 50 +++++++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/todt.c b/src/todt.c index 37cee1505afb..bb18af61cf9c 100644 --- a/src/todt.c +++ b/src/todt.c @@ -792,8 +792,7 @@ dt_t **toDtElem(TypeSArray *tsa, dt_t **pdt, Expression *e) Type *tbn = tnext->toBasetype(); while (tbn->ty == Tsarray && (!e || tbn != e->type->nextOf())) { - TypeSArray *tsa = (TypeSArray *)tbn; - len *= tsa->dim->toInteger(); + len *= ((TypeSArray *)tbn)->dim->toInteger(); tnext = tbn->nextOf(); tbn = tnext->toBasetype(); } @@ -801,10 +800,14 @@ dt_t **toDtElem(TypeSArray *tsa, dt_t **pdt, Expression *e) e = tsa->defaultInit(Loc()); // use default initializer Expression_toDt(e, pdt); dt_optimize(*pdt); - if (e->op == TOKstring) - len /= ((StringExp *)e)->len; - if (e->op == TOKarrayliteral) - len /= ((ArrayLiteralExp *)e)->elements->dim; + if (!e->type->implicitConvTo(tnext)) // Bugzilla 14996 + { + // Bugzilla 1914, 3198 + if (e->op == TOKstring) + len /= ((StringExp *)e)->len; + else if (e->op == TOKarrayliteral) + len /= ((ArrayLiteralExp *)e)->elements->dim; + } pdt = dtrepeat(pdt, *pdt, len - 1); } return pdt; diff --git a/test/runnable/structlit.d b/test/runnable/structlit.d index 29ad07feeb1e..11c5b8886151 100644 --- a/test/runnable/structlit.d +++ b/test/runnable/structlit.d @@ -648,14 +648,14 @@ struct Bug1914a { const char[10] i = [1,0,0,0,0,0,0,0,0,0]; char[10] x = i; - int y=5; + int y = 5; } struct Bug1914b { const char[10] i = [0,0,0,0,0,0,0,0,0,0]; char[10] x = i; - int y=5; + int y = 5; } struct Bug1914c @@ -668,36 +668,50 @@ struct Bug1914c int y = 5; char[2][3] z = j; char[2][3] w = k; - int v=27; + int v = 27; char[2][3] u = l; int t = 718; } -struct T3198 { - int g = 1; +struct T3198 +{ + int g = 1; } -class Foo3198 { - int[5] x = 6; - T3198[5] y = T3198(4); +class Foo3198 +{ + int[5] x = 6; + T3198[5] y = T3198(4); } void test3198and1914() { Bug1914a a; - assert(a.y==5, "bug 1914, non-zero init"); + assert(a.y == 5, "bug 1914, non-zero init"); Bug1914b b; - assert(b.y==5, "bug 1914, zero init"); + assert(b.y == 5, "bug 1914, zero init"); Bug1914c c; - assert(c.y==5, "bug 1914, multilevel init"); - assert(c.v==27, "bug 1914, multilevel init2"); - assert(c.x[2][1]=='b'); - assert(c.t==718, "bug 1914, multi3"); - assert(c.u[1][0]=='p'); - assert(c.u[1][1]==char.init); + assert(c.y == 5, "bug 1914, multilevel init"); + assert(c.v == 27, "bug 1914, multilevel init2"); + assert(c.x[2][1] == 'b'); + assert(c.t == 718, "bug 1914, multi3"); + assert(c.u[1][0] == 'p'); + assert(c.u[1][1] == char.init); auto f = new Foo3198(); - assert(f.x[0]==6); - assert(f.y[0].g==4, "bug 3198"); + assert(f.x[0] == 6); + assert(f.y[0].g == 4, "bug 3198"); +} + +/********************************************/ +// 14996 + +enum E14996a : string { confirm = "confirm" } +enum E14996b : long[] { confirm = [1,2,3,4] } + +struct S14996 +{ + E14996a[1] data1; + E14996b[1] data2; } /********************************************/