Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
January 09, 2015 Cast a struct to void* | ||||
---|---|---|---|---|
| ||||
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? |
January 09, 2015 Re: Cast a struct to void* | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | 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`.
|
January 09, 2015 Re: Cast a struct to void* | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | 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
|
January 09, 2015 Re: Cast a struct to void* | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | 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 :) |
January 09, 2015 Re: Cast a struct to void* | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | 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 |
January 13, 2015 Re: Cast a struct to void* | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | 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, ...)
|
Copyright © 1999-2021 by the D Language Foundation