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



--- Comment #1 from Kenji Hara <k.hara...@gmail.com> 2013-02-20 23:48:00 PST ---
(In reply to comment #0)
> void f(int** ptr)
> {
>     assert(**ptr == 10);
> }
> 
> void main()
> {
>     int* i = new int;
>     *i = 10;
>     int*[1] x = [i];
>     f(&x[0]);
> }

More simple case:

    int*[1] x;
    int* p = new int;
    x = [p];    // is wrongly rewritten to: x[] = [p].ptr
    printf("p = %p, x[0] = %p\n", p, x[0]);
    assert(p == x[0]);  // fails!?

----

This is horribly serious problem.

The root issue is in TypeDArray::implicitConvTo. FROM THE BEGINNING of D2, an
implicit conversion from dynamic array to its element pointer type as a
deprecated feature.

    int[] arr;  int* p;
    p = arr;  // is expected to rewrite to p = arr.ptr

BUT, it was completely broken FROM THE BEGINNING of D2. Instead of the expected
behavior, dynamic array can be convertible to its element type.

    int*[] arr = [null];
    int* p;
    p = arr;    // bad!
    printf("p = %p, arr.ptr = %p\n", p, arr.ptr);

It has been wrongly accepted in long time if '-d' switch is specified. Then,
from 2.061, the situation has become worse by "informational deprecated error
in default". Above code would be _silently_ accepted in default, and compiler
outputs wrong-code.

----

But, we cannot *fix* TypeDArray::implicitConvTo to implement the deprecated
feature, because it breaks phobos building.

In std.process line 367:
    scope(exit) if (exists(filename)) remove(filename);   // <----

Today, it calls std.file.remove in here.

std.stdio.file line 413:
    void remove(in char[] name)

But std.process also imports core.stdc.stdio through std.stdio. In there
another 'remove' is defined.

core.stdc.stdio line 453:
    int remove(in char* filename);   // <----

After *fixing* the deprecated feature, the 'remove' call in std.process will
match both 'remove's that defined in different modules, and it will raise an
error according to overload set resolution rule.

std\process.d(367): Error: std.file.remove at std\file.d(413) conflicts with
core.stdc.stdio.remove at
C:\Users\khara\dmd2\src\druntime\import\core\stdc\stdio.d(453)

----

So as a conclusion, we should just remove the deprecated "array to pointer
conversion" feature, rather than fixing broken deprecated feature that already
outdated.

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

Reply via email to