www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 3990] New: Deferencing a dynamic array as pointer

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

           Summary: Deferencing a dynamic array as pointer
           Product: D
           Version: 2.041
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Keywords: accepts-invalid
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: bearophile_hugs eml.cc


--- Comment #0 from bearophile_hugs eml.cc 2010-03-20 05:57:22 PDT ---
This D2 code is currrently allowed, but I think it has to become a syntax
error, dynamic arrays are not pointers:

void main() {
   int[] a1 = [5, 4, 3];
   assert(*a1 == 5);
   alias typeof(a1) T1;
   assert(is(typeof(*T1)));
   int* p1 = cast(int*)a1;
   assert(p1 == a1.ptr);
}

----------------

Similar code can be written for a fixed-size array like:
int[3] a2 = [5, 4, 3];

For fixed-size arrays such conversions to pointers can be more acceptable.

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



--- Comment #1 from bearophile_hugs eml.cc 2010-05-06 04:15:13 PDT ---
Another case that I think is related:


import std.stdio: writeln;
struct Arr(int N) {
    int[N] data;
    alias data this;
}
void main() {
    auto p = new Arr!(10);
    *p = 10;
    writeln(p.data); // Output: 10 10 10 10 10 10 10 10 10 10
}

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



--- Comment #2 from bearophile_hugs eml.cc 2011-04-26 10:39:52 PDT ---
More very good rationale from Steven Schveighoffer, that I think settles the
situation:

http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=135391

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



--- Comment #3 from Kenji Hara <k.hara.pg gmail.com> 2011-10-31 04:30:21 PDT ---
(In reply to comment #0)

1.
    assert(*a1 == 5);
    alias typeof(a1) T1;
    assert(is(typeof(*T1)));
Dereferencing dynamic or static array without -d option is deprecated. I think this is 'accepts-invalid'. 2.
    int* p1 = cast(int*)a1;
    assert(p1 == a1.ptr);
Explicit casting is still valid. cast(int*)a1 means cast(int*)a1.ptr -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 31 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3990



--- Comment #4 from Kenji Hara <k.hara.pg gmail.com> 2011-10-31 04:33:36 PDT ---
(In reply to comment #1)

This is not related.

     auto p = new Arr!(10);
     *p = 10;
means Arr!(10)* p = new Arr!(10); (*p).data = 10; // see alias this after deref-ing of p And, the assignment an element type into static array is valid. int[10] sa; sa = 10; // translated to sa[] = 10 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 31 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3990



--- Comment #5 from bearophile_hugs eml.cc 2011-10-31 05:36:43 PDT ---
(In reply to comment #3)

    assert(*a1 == 5);
    alias typeof(a1) T1;
    assert(is(typeof(*T1)));
Dereferencing dynamic or static array without -d option is deprecated. I think this is 'accepts-invalid'.
Don agrees: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=148054
 2.
    int* p1 = cast(int*)a1;
    assert(p1 == a1.ptr);
Explicit casting is still valid. cast(int*)a1 means cast(int*)a1.ptr
I don't see the need to accept this cast. There is the ".ptr" so this cast is not useful in practice. And generally this cast is refused by DMD 2.056 as you see in the following program, so you are introducing/leaving an useless special case: struct Foo { int* p; size_t n; } void main() { Foo f; auto x = cast(int*)f; } So I think cast(int*)a1 should be forbidden. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 31 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3990



--- Comment #6 from bearophile_hugs eml.cc 2011-10-31 05:39:53 PDT ---
(In reply to comment #4)

 This is not related.
You are right, it's not related, it's a different problem.
 And, the assignment an element type into static array is valid.
 
   int[10] sa;
   sa = 10;  // translated to sa[] = 10
It's currently valid, but I think it should be forbidden. I think D should require the [] here. See bug 3971 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 31 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3990



--- Comment #7 from Kenji Hara <k.hara.pg gmail.com> 2011-10-31 07:43:01 PDT ---
(In reply to comment #5)
 I don't see the need to accept this cast. There is the ".ptr" so this cast is
 not useful in practice. And generally this cast is refused by DMD 2.056 as you
 see in the following program, so you are introducing/leaving an useless special
 case:
 
[snip]
 So I think cast(int*)a1 should be forbidden.
The title of this issue is "Deferencing a dynamic array as pointer". Therefore even if you think it is not useful, we should not discuss it in here. Instead, you can file it as a new issue. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 31 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3990


Kenji Hara <k.hara.pg gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch


--- Comment #8 from Kenji Hara <k.hara.pg gmail.com> 2011-10-31 07:49:27 PDT ---
https://github.com/D-Programming-Language/dmd/pull/483

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 31 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3990



--- Comment #9 from bearophile_hugs eml.cc 2011-10-31 12:24:36 PDT ---
(In reply to comment #7)

Thank you for the patch.


 The title of this issue is "Deferencing a dynamic array as pointer".
 Therefore even if you think it is not useful, we should not discuss it in here.

 Instead, you can file it as a new issue.
I have lumped them together because to me they look like quite similar issues: in both cases an array is seen as a pointer. But OK, I have opened the new report bug 6869 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 31 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3990


Walter Bright <bugzilla digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla digitalmars.com
         Resolution|                            |FIXED


--- Comment #10 from Walter Bright <bugzilla digitalmars.com> 2011-11-01
13:16:14 PDT ---
https://github.com/D-Programming-Language/dmd/commit/889fd53a5bc849d88ce1c3a8c907930f88471144

https://github.com/D-Programming-Language/dmd/commit/95b6e6b5188a59b32e6333b2053b6d06798c64f3

https://github.com/D-Programming-Language/dmd/commit/0b49647ad92be63274c156bbc7a6d9213a25d9ae

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


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jarrett.billingsley gmail.c
                   |                            |om


--- Comment #11 from Don <clugdbug yahoo.com.au> 2011-12-22 00:48:28 PST ---
*** Issue 1381 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Dec 22 2011
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3990


yebblies <yebblies gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |2korden gmail.com


--- Comment #12 from yebblies <yebblies gmail.com> 2012-01-29 22:37:16 EST ---
*** Issue 4772 has been marked as a duplicate of this issue. ***

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