www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 3522] New: ICE(cg87.c): variable*array[].

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3522

           Summary: ICE(cg87.c):   variable*array[].
           Product: D
           Version: 1.051
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Keywords: ice-on-invalid-code
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: clugdbug yahoo.com.au


--- Comment #0 from Don <clugdbug yahoo.com.au> 2009-11-18 07:13:26 PST ---
void main() {
    double[] foo = [1.0, 2.0, 3.0];
    double y = 2.0;
    double[] c = y * foo[];
}

Internal error: backend\cg87.c 1363

Related to bug 2549.
Doesn't ICE with foo[]*y; generates bad code instead. Applies to both D1 and
D2.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Nov 18 2009
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3522



--- Comment #1 from Don <clugdbug yahoo.com.au> 2010-04-28 20:55:10 PDT ---
This patch also fixes:
bug 2549 Segfault on array multiplication.
bug 3066 Array operation without a slice as the lvalue accepted, bad codegen
bug 3817 Array op: wrong error message

The root cause is that array operations which require memory allocations are
not handled in the front-end. At entry to the backend, no array ops should
still exist inside expressions. Currently, only arr[]+arr[] and arr[]-arr[]
generate error messages; all other cases get passed through to the backend,
resulting in bad code generation or an ICE.
The error messages just need to be expanded to cover the other cases.
(Note that when the front-end supports these types of operations, this test is
still useful -- it acts as an assert for the backend).

PATCH:
e2ir.c, around line 2098. AddExp, MinExp catch errors, but the other array ops
don't.
They all need to catch var*arr, arr*var as well as arr*arr.

(The var+arr check is required for the example in the comments in 3066).

The error message is confusing (this is bug 3817), for all of them should be
something like:
Should be "Array operation %s not implemented (requires memory allocation)"

NegExp needs to be treated, as well. For each of AddExp, MinExp, MulExp,
DivExp,
the code should be of this form (with only the OPmul line changing).

elem *MulExp::toElem(IRState *irs)
{   elem *e;
    Type *tb1 = e1->type->toBasetype();
    Type *tb2 = e2->type->toBasetype();

    if ((tb1->ty == Tarray || tb1->ty == Tsarray) ||
        (tb2->ty == Tarray || tb2->ty == Tsarray)
       )
    {
        error("Array operation %s not implemented (requires memory
allocation)", toChars());
        e = el_long(type->totym(), 0);  // error recovery
    }
    else
        e = toElemBin(irs, OPmul);
    return e;
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 28 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3522


bearophile_hugs eml.cc changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bearophile_hugs eml.cc


--- Comment #2 from bearophile_hugs eml.cc 2010-04-29 02:28:23 PDT ---
 The error message is confusing (this is bug 3817), for all of them should be
 something like:
 Should be "Array operation %s not implemented (requires memory allocation)"

I don't understand. In a program like: void main() { int[] a1 = [1]; int[] a2 = [2]; int[] a3; a3 = a1 + a2; } I think the compiler has to write an error message like: test.d(5): Error: Array operator + not supported (have you forgotten the []?) So this is more correct code: void main() { int[] a1 = [1]; int[] a2 = [2]; int[] a3; a3[] = a1[] + a2[]; } But array ops don't allocate memory, so the a3 array can't be filled. This prints nothing: import std.stdio: writeln; void main() { int[] a1 = [1]; int[] a2 = [2]; int[] a3; a3[] = a1[] + a2[]; writeln(a3); } This other error can be found at runtime... -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Apr 29 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3522


Walter Bright <bugzilla digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bugzilla digitalmars.com


--- Comment #3 from Walter Bright <bugzilla digitalmars.com> 2010-04-29
21:05:19 PDT ---
Changeset 460

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 29 2010
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3522


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED


--- Comment #4 from Don <clugdbug yahoo.com.au> 2010-05-05 19:07:20 PDT ---
Fixed DMD2.044

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 05 2010