December 31, 2019
On Tuesday, 31 December 2019 at 13:35:42 UTC, Paul Backus wrote:
> On Tuesday, 31 December 2019 at 11:20:31 UTC, Patrick Schluter wrote:
>> Is it really a bug?
>
> Yes. Perhaps this example will convince you:
>
> void foo(size_t N)(int[N] arr)
> {
>     arr[0] = 42;
> }
>
> void foo()(int[] arr)
> {
>     arr[0] = 42;
> }
>
> void main()
> {
>     int[16] x;
>     foo(x[]);
>     assert(x[0] == 42); // fails
> }

void foo(size_t N)(int[N] arr) does nothing. I doubt this is a bug too.
December 31, 2019
On 12/31/19 12:24 PM, Temtaime wrote:
> On Tuesday, 31 December 2019 at 13:35:42 UTC, Paul Backus wrote:
>> On Tuesday, 31 December 2019 at 11:20:31 UTC, Patrick Schluter wrote:
>>> Is it really a bug?
>>
>> Yes. Perhaps this example will convince you:
>>
>> void foo(size_t N)(int[N] arr)
>> {
>>     arr[0] = 42;
>> }
>>
>> void foo()(int[] arr)
>> {
>>     arr[0] = 42;
>> }
>>
>> void main()
>> {
>>     int[16] x;
>>     foo(x[]);
>>     assert(x[0] == 42); // fails
>> }
> 
> void foo(size_t N)(int[N] arr) does nothing. I doubt this is a bug too.

int[N] foo(size_t N)(int[N] arr)
{
   arr[0] = 42;
   return arr;
}

Better?

The use case that spurred this discovery is this:

ubyte[16] hash;

string hexStr = toHexString(hash); // slices a temporary that is immediately removed from scope

The fix should be:

string hexStr = toHexString(hash[]);

But it doesn't do anything different. In order to do it correctly, you have to literally declare another variable, or cast. Hell, I don't even know if the cast will work!

-Steve
1 2
Next ›   Last »