Thread overview | ||||||
---|---|---|---|---|---|---|
|
January 13, 2012 CTFE and cast | ||||
---|---|---|---|---|
| ||||
When replace typedef to enum, it became impossible to compile a certain portion. dmd v2.057 Windows -------------------------------------------- enum HANDLE : void* {init = (void*).init} pure HANDLE int_to_HANDLE(int x) { return cast(HANDLE)x; } void bar() { HANDLE a = cast(HANDLE)1;// ok HANDLE b = int_to_HANDLE(2);// ok } HANDLE c = cast(HANDLE)3;// ok HANDLE d = int_to_HANDLE(4);// NG -------------------------------------------- foo.d(17): Error: cannot implicitly convert expression (cast(void*)4u) of type void* to HANDLE |
January 13, 2012 Re: CTFE and cast | ||||
---|---|---|---|---|
| ||||
Posted in reply to k2 | On 13/01/12 10:01, k2 wrote:
> When replace typedef to enum, it became impossible to compile a certain portion.
>
> dmd v2.057 Windows
> --------------------------------------------
> enum HANDLE : void* {init = (void*).init}
>
> pure HANDLE int_to_HANDLE(int x)
> {
> return cast(HANDLE)x;
> }
>
> void bar()
> {
> HANDLE a = cast(HANDLE)1;// ok
> HANDLE b = int_to_HANDLE(2);// ok
> }
>
> HANDLE c = cast(HANDLE)3;// ok
> HANDLE d = int_to_HANDLE(4);// NG
> --------------------------------------------
> foo.d(17): Error: cannot implicitly convert expression (cast(void*)4u)
> of type void* to HANDLE
It's a problem. Casting integers to pointers is a very unsafe operation, and is disallowed in CTFE. There is a special hack, specifically for Windows HANDLES, which allows you to cast integers to pointers at compile time, but only after they've left CTFE.
|
January 13, 2012 Re: CTFE and cast | ||||
---|---|---|---|---|
| ||||
Posted in reply to Don Clugston | Don Clugston wrote:
> On 13/01/12 10:01, k2 wrote:
>> When replace typedef to enum, it became impossible to compile a certain portion.
>>
>> dmd v2.057 Windows
>> --------------------------------------------
>> enum HANDLE : void* {init = (void*).init}
>>
>> pure HANDLE int_to_HANDLE(int x)
>> {
>> return cast(HANDLE)x;
>> }
>>
>> void bar()
>> {
>> HANDLE a = cast(HANDLE)1;// ok
>> HANDLE b = int_to_HANDLE(2);// ok
>> }
>>
>> HANDLE c = cast(HANDLE)3;// ok
>> HANDLE d = int_to_HANDLE(4);// NG
>> --------------------------------------------
>> foo.d(17): Error: cannot implicitly convert expression (cast(void*)4u)
>> of type void* to HANDLE
>
> It's a problem. Casting integers to pointers is a very unsafe operation, and is disallowed in CTFE. There is a special hack, specifically for Windows HANDLES, which allows you to cast integers to pointers at compile time, but only after they've left CTFE.
Do you plan to support endianness handling at CTFE?
I mean to write something like this at CT:
union U
{
ubyte[4] ar;
uint num;
}
U u;
u.num = 0x04030201;
if (u.ar[0] == 1)
// little endian
else
// big endian
This is needed to support crypto hashing at CT. std.uuid can generate uuids based on strings, but they must be hashed first.
|
January 17, 2012 Re: CTFE and cast | ||||
---|---|---|---|---|
| ||||
Posted in reply to Don Clugston | Where can I find a "special hack"?
thanks.
(2012/01/13 21:58), Don Clugston wrote:
> On 13/01/12 10:01, k2 wrote:
>> When replace typedef to enum, it became impossible to compile a certain portion.
>>
>> dmd v2.057 Windows
>> --------------------------------------------
>> enum HANDLE : void* {init = (void*).init}
>>
>> pure HANDLE int_to_HANDLE(int x)
>> {
>> return cast(HANDLE)x;
>> }
>>
>> void bar()
>> {
>> HANDLE a = cast(HANDLE)1;// ok
>> HANDLE b = int_to_HANDLE(2);// ok
>> }
>>
>> HANDLE c = cast(HANDLE)3;// ok
>> HANDLE d = int_to_HANDLE(4);// NG
>> --------------------------------------------
>> foo.d(17): Error: cannot implicitly convert expression (cast(void*)4u)
>> of type void* to HANDLE
>
> It's a problem. Casting integers to pointers is a very unsafe operation, and is disallowed in CTFE. There is a special hack, specifically for Windows HANDLES, which allows you to cast integers to pointers at compile time, but only after they've left CTFE.
>
>
>
|
Copyright © 1999-2021 by the D Language Foundation