Showing with 38 additions and 4 deletions.
  1. +6 −3 src/backend/cgelem.c
  2. +32 −1 test/runnable/mars1.d
9 changes: 6 additions & 3 deletions src/backend/cgelem.c
Original file line number Diff line number Diff line change
Expand Up @@ -3528,9 +3528,11 @@ STATIC elem * eleq(elem *e, goal_t goal)
if (tysize(e1->Ety) == 2 * REGSIZE &&
e1->Eoper == OPvar &&
(e2->Eoper == OPpair || e2->Eoper == OPrpair) &&
goal == GOALnone
goal == GOALnone &&
!el_appears(e2, e1->EV.sp.Vsym)
)
{
//printf("** before:\n"); WReqn(e); printf("\n");
tym_t ty = (REGSIZE == 8) ? TYllong : TYint;
if (tyfloating(e1->Ety) && REGSIZE >= 4)
ty = (REGSIZE == 8) ? TYdouble : TYfloat;
Expand All @@ -3545,8 +3547,8 @@ STATIC elem * eleq(elem *e, goal_t goal)
{
e->E2 = e2->E1;
eb = el_bin(OPeq,ty,eb,e2->E2);
e2->E1 = eb;
e2->E2 = e;
e2->E1 = e;
e2->E2 = eb;
}
else
{
Expand All @@ -3557,6 +3559,7 @@ STATIC elem * eleq(elem *e, goal_t goal)
}

e2->Eoper = OPcomma;
//printf("** after:\n"); WReqn(e2); printf("\n");
return optelem(e2,goal);
}

Expand Down
33 changes: 32 additions & 1 deletion test/runnable/mars1.d
Original file line number Diff line number Diff line change
Expand Up @@ -1357,7 +1357,36 @@ void test2()
}

////////////////////////////////////////////////////////////////////////


void test3()
{
int[6] a;
int[] b;
b = a;
b = (b.ptr + b.length - 5)[0 .. b.ptr + b.length - 1 - a.ptr];
assert(b.ptr == a.ptr + 1);
assert(b.length == 5);
}

////////////////////////////////////////////////////////////////////////

void[] calloc15272(size_t bc) nothrow pure
{
assert(bc == 1);
return new void[1];
}

void test15272()
{
void[] scache = cast(void[])"abc";
size_t count = 1;
void[]* buckets = &scache;
*buckets = calloc15272(count)[0 .. count];
}


////////////////////////////////////////////////////////////////////////

int main()
{
testgoto();
Expand Down Expand Up @@ -1402,6 +1431,8 @@ int main()
test14220();
test14829();
test2();
test3();
test15272();
printf("Success\n");
return 0;
}