www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Cast a struct to void*

reply "John Colvin" <john.loughran.colvin gmail.com> writes:
struct S
{
     void* p;
}

void main()
{
     S s;
     auto a = cast(void*)s; //Error: e2ir: cannot cast s of type S 
to type void*
}

Is there are a good reason for this being disallowed?
Jan 09 2015
next sibling parent reply "anonymous" <anonymous example.com> writes:
On Friday, 9 January 2015 at 18:25:42 UTC, John Colvin wrote:
 struct S
 {
     void* p;
 }

 void main()
 {
     S s;
     auto a = cast(void*)s; //Error: e2ir: cannot cast s of type 
 S to type void*
 }

 Is there are a good reason for this being disallowed?
You'd expect `cast(void*)s == s.p`? That doesn't work for any type of p. You can do it with a slightly fancier (and more dangerous) cast: `*cast(void**)&s`.
Jan 09 2015
parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Friday, 9 January 2015 at 18:35:56 UTC, anonymous wrote:
 On Friday, 9 January 2015 at 18:25:42 UTC, John Colvin wrote:
 struct S
 {
    void* p;
 }

 void main()
 {
    S s;
    auto a = cast(void*)s; //Error: e2ir: cannot cast s of type 
 S to type void*
 }

 Is there are a good reason for this being disallowed?
You'd expect `cast(void*)s == s.p`? That doesn't work for any type of p.
I was expecting it to work regardless of the type of p. I have an 8 byte (on x86_64) struct which I want to reinterpret as a void*
 You can do it with a slightly fancier (and more dangerous) 
 cast: `*cast(void**)&s`.
Yuk. Better than nothing though. Thanks :)
Jan 09 2015
parent reply Steven Schveighoffer <schveiguy yahoo.com> writes:
On 1/9/15 1:50 PM, John Colvin wrote:
 On Friday, 9 January 2015 at 18:35:56 UTC, anonymous wrote:
 On Friday, 9 January 2015 at 18:25:42 UTC, John Colvin wrote:
 struct S
 {
    void* p;
 }

 void main()
 {
    S s;
    auto a = cast(void*)s; //Error: e2ir: cannot cast s of type S to
 type void*
This is actually a compiler bug! I will check to make sure it's not already filed, and file if it's not. However, I don't think the code should work, it just shouldn't print e2ir.
 }

 Is there are a good reason for this being disallowed?
You'd expect `cast(void*)s == s.p`? That doesn't work for any type of p.
I was expecting it to work regardless of the type of p. I have an 8 byte (on x86_64) struct which I want to reinterpret as a void*
 You can do it with a slightly fancier (and more dangerous) cast:
 `*cast(void**)&s`.
Yuk. Better than nothing though. Thanks :)
This is what reinterpret_cast from C++ does. -Steve
Jan 09 2015
parent "John Colvin" <john.loughran.colvin gmail.com> writes:
On Friday, 9 January 2015 at 19:03:04 UTC, Steven Schveighoffer 
wrote:
 On 1/9/15 1:50 PM, John Colvin wrote:
 On Friday, 9 January 2015 at 18:35:56 UTC, anonymous wrote:
 On Friday, 9 January 2015 at 18:25:42 UTC, John Colvin wrote:
 struct S
 {
   void* p;
 }

 void main()
 {
   S s;
   auto a = cast(void*)s; //Error: e2ir: cannot cast s of 
 type S to
 type void*
This is actually a compiler bug!
So it is! The same happens with e.g. casting void* to string. Annoyingly it passes __traits(compiles, ...)
Jan 13 2015
prev sibling parent =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 01/09/2015 10:25 AM, John Colvin wrote:
 struct S
 {
      void* p;
 }

 void main()
 {
      S s;
      auto a = cast(void*)s; //Error: e2ir: cannot cast s of type S to
 type void*
 }

 Is there are a good reason for this being disallowed?
I know two options: a) alias p this; b) auto opCast(T : void*)() { return p; } Ali
Jan 09 2015