D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 4578 - Regression(2.047,1.062): ICE(cgcod.c): var+arr[]
Summary: Regression(2.047,1.062): ICE(cgcod.c): var+arr[]
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: Other All
: P2 regression
Assignee: No Owner
URL:
Keywords: ice-on-invalid-code, patch
Depends on:
Blocks:
 
Reported: 2010-08-03 15:52 UTC by Michael Parrott
Modified: 2015-06-09 05:11 UTC (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Michael Parrott 2010-08-03 15:52:45 UTC
Code to create ICE:

void main()
{
    int[] foo;
    int y = 2;
    int[] c = y + foo[];
}

$ dmd test.d
Internal error: ../ztc/cgcod.c 1596

The same error occurs if using the operators +, -, or %.

The proper error is given with operators * and /. (Proper error I think is what is being given in 1.061)

In 1.061, I would receive this error:

test.d(5): Error: Array operation y + foo[] not implemented

This seems to be because functions AddExp::toElem, MinExp::toElem and ModExp::toElem in e2ir.c do not have the code that checks for a non-valid array. The code from these was taken out in 1.062.

The code seemed to be added for MulExp and DivExp because of this issue:

http://d.puremagic.com/issues/show_bug.cgi?id=3522

but was later taken out of AddExp and MinExp.

Perhaps this code in BinExp::toElem:

if ((tb1->ty == Tarray || tb1->ty == Tsarray) &&

    (tb2->ty == Tarray || tb2->ty == Tsarray) &&

     op != OPeq

     )

Should be:

if ((tb1->ty == Tarray || tb1->ty == Tsarray) ||
    (tb2->ty == Tarray || tb2->ty == Tsarray) &&

     op != OPeq

     )

That might catch array ops errors for all of the xxxExp types.
Comment 1 Don 2010-08-04 00:13:42 UTC
That suggested patch is almost right. It fails even for the test case, though! It needs to allow void assignments. This patch below passes the test suite.

PATCH: e2ir.c, BinExp::toElemBin(), line 2004.

    if ((tb1->ty == Tarray || tb1->ty == Tsarray || 
         tb2->ty == Tarray || tb2->ty == Tsarray) &&
        tb2->ty != Tvoid &&
        op != OPeq && op != OPandand && op != OPoror
       )
    {
        error("Array operation %s not implemented", toChars());
        return el_long(type->totym(), 0);  // error recovery
    }
Comment 2 Walter Bright 2010-08-05 11:16:41 UTC
http://www.dsource.org/projects/dmd/changeset/600