Re: partial initialization of fixed size ("static") arrays

2021-08-15 Thread kdevel via Digitalmars-d-learn

On Saturday, 14 August 2021 at 23:09:14 UTC, Paul Backus wrote:

On Saturday, 14 August 2021 at 14:04:47 UTC, kdevel wrote:

~~~
   char [7] d7 = "x"; // okay

   string s = "x";
   char [7] c7 = s; // throws RangeError
~~~

What justifies that the compiler behaves differently on two 
terms ('s', '"x"') which are of equal size, type, length and 
value?


Literals in D can have different types in different contexts. 
For example:


```d
byte b = 16; // 16 is treated as a byte literal
int n = 16; // 16 is treated as an int literal
b = n; // Error: cannot convert int to byte
```


The wording of the error message

~~~d
void main () // bi.d
{
   byte b = 257;
}

$ dmd bi.d
bi.d(3): Error: cannot implicitly convert expression `257` of 
type `int` to `byte`

~~~

does not seem to support your interpretation. The term `257` does 
not encode a ‘polymorphic’ entity but the int value 257 which is 
used to initialize a variable. If necessary, the value is 
converted. The literal is not “typeless” as in Go [1] either.


Similarly, the string literal `"x"` can be treated either as a 
`string` (a dynamic array of `immutable(char)`) or as a static 
array of `char`, depending on the type of variable it's 
assigned to.


[1] https://blog.golang.org/constants


Re: partial initialization of fixed size ("static") arrays

2021-08-14 Thread Paul Backus via Digitalmars-d-learn

On Saturday, 14 August 2021 at 14:04:47 UTC, kdevel wrote:

~~~
   char [7] d7 = "x"; // okay

   string s = "x";
   char [7] c7 = s; // throws RangeError
~~~

What justifies that the compiler behaves differently on two 
terms ('s', '"x"') which are of equal size, type, length and 
value?


Literals in D can have different types in different contexts. For 
example:


```d
byte b = 16; // 16 is treated as a byte literal
int n = 16; // 16 is treated as an int literal
b = n; // Error: cannot convert int to byte
```

Similarly, the string literal `"x"` can be treated either as a 
`string` (a dynamic array of `immutable(char)`) or as a static 
array of `char`, depending on the type of variable it's assigned 
to.


Re: partial initialization of fixed size ("static") arrays

2021-08-14 Thread frame via Digitalmars-d-learn

On Saturday, 14 August 2021 at 14:04:47 UTC, kdevel wrote:

On Saturday, 14 August 2021 at 13:01:13 UTC, frame wrote:
I would say case [...] 3 is not [a bug]. It's just the element 
type conversion and mismatched lengths of the ranges.


~~~
   char [7] d7 = "x"; // okay

   string s = "x";
   char [7] c7 = s; // throws RangeError
~~~

What justifies that the compiler behaves differently on two 
terms ('s', '"x"') which are of equal size, type, length and 
value?


One is pure initialization, CTFE magic for strings or something 
like that. The other one is an assignment of an already created 
range where length check kicks in. The compiler is fine with that 
as it compiles. It's the bound checker at runtime level that 
bails out.


Re: partial initialization of fixed size ("static") arrays

2021-08-14 Thread Tejas via Digitalmars-d-learn

On Saturday, 14 August 2021 at 14:33:42 UTC, kdevel wrote:

On Saturday, 14 August 2021 at 14:18:57 UTC, Tejas wrote:

On Saturday, 14 August 2021 at 14:04:47 UTC, kdevel wrote:

On Saturday, 14 August 2021 at 13:01:13 UTC, frame wrote:
I would say case [...] 3 is not [a bug]. It's just the 
element type conversion and mismatched lengths of the ranges.


~~~
   char [7] d7 = "x"; // okay

   string s = "x";
   char [7] c7 = s; // throws RangeError
~~~

What justifies that the compiler behaves differently on two 
terms ('s', '"x"') which are of equal size, type, length and 
value?


They are not.

assert(string.sizeof != char.sizeof);


The terms are s and "x":

~~~r.d
void main ()
{
   string s = "x";
   assert (s.sizeof == "x".sizeof);
}
~~~


It did implicit conversion on the literal but not the variable.
Basically,
```d
char[7] a = cast(char[7])"x"; // works
string s = "x";
char[7] b = cast(char[7])s; //fails
```
That's my best guess.

Hopefully someone more experienced chimes in.


Re: partial initialization of fixed size ("static") arrays

2021-08-14 Thread kdevel via Digitalmars-d-learn

On Saturday, 14 August 2021 at 14:18:57 UTC, Tejas wrote:

On Saturday, 14 August 2021 at 14:04:47 UTC, kdevel wrote:

On Saturday, 14 August 2021 at 13:01:13 UTC, frame wrote:
I would say case [...] 3 is not [a bug]. It's just the 
element type conversion and mismatched lengths of the ranges.


~~~
   char [7] d7 = "x"; // okay

   string s = "x";
   char [7] c7 = s; // throws RangeError
~~~

What justifies that the compiler behaves differently on two 
terms ('s', '"x"') which are of equal size, type, length and 
value?


They are not.

assert(string.sizeof != char.sizeof);


The terms are s and "x":

~~~r.d
void main ()
{
   string s = "x";
   assert (s.sizeof == "x".sizeof);
}
~~~




Re: partial initialization of fixed size ("static") arrays

2021-08-14 Thread Tejas via Digitalmars-d-learn

On Saturday, 14 August 2021 at 14:04:47 UTC, kdevel wrote:

On Saturday, 14 August 2021 at 13:01:13 UTC, frame wrote:
I would say case [...] 3 is not [a bug]. It's just the element 
type conversion and mismatched lengths of the ranges.


~~~
   char [7] d7 = "x"; // okay

   string s = "x";
   char [7] c7 = s; // throws RangeError
~~~

What justifies that the compiler behaves differently on two 
terms ('s', '"x"') which are of equal size, type, length and 
value?


They are not.

assert(string.sizeof != char.sizeof);


Re: partial initialization of fixed size ("static") arrays

2021-08-14 Thread kdevel via Digitalmars-d-learn

On Saturday, 14 August 2021 at 13:01:13 UTC, frame wrote:
I would say case [...] 3 is not [a bug]. It's just the element 
type conversion and mismatched lengths of the ranges.


~~~
   char [7] d7 = "x"; // okay

   string s = "x";
   char [7] c7 = s; // throws RangeError
~~~

What justifies that the compiler behaves differently on two terms 
('s', '"x"') which are of equal size, type, length and value?


Re: partial initialization of fixed size ("static") arrays

2021-08-14 Thread Tejas via Digitalmars-d-learn

On Saturday, 14 August 2021 at 13:01:13 UTC, frame wrote:

On Saturday, 14 August 2021 at 09:40:54 UTC, kdevel wrote:


Shall I file them to bugzilla?


I would say case 2 and 3 are not bugs. It's just the element 
type conversion and mismatched lengths of the ranges.


Not sure about the first one.


Yeah, I jumped the train :(

Replace ```string``` with ```char``` and double quotes with 
single quotes then case 2 and 3 give the expected output


1 is 100% a bug, please report that.


Re: partial initialization of fixed size ("static") arrays

2021-08-14 Thread frame via Digitalmars-d-learn

On Saturday, 14 August 2021 at 09:40:54 UTC, kdevel wrote:


Shall I file them to bugzilla?


I would say case 2 and 3 are not bugs. It's just the element type 
conversion and mismatched lengths of the ranges.


Not sure about the first one.




Re: partial initialization of fixed size ("static") arrays

2021-08-14 Thread Tejas via Digitalmars-d-learn

On Saturday, 14 August 2021 at 09:40:54 UTC, kdevel wrote:
Today I stumbled across three issues with partial 
initialization of "static" arrays:


~~~i1.d
void main ()
{
   char [7] b = [ 1: 'x' ]; // okay
   char [7] a = [ 0: 'x' ]; // i1.d(4): Error: mismatched array 
lengths, 7 and 1

}
~~~

~~~i2.d
import std.stdio;

void main ()
{
   char [7] c7 = [ 1: 'x' ];
   writeln (cast (ubyte [7]) c7); // [255, 120, 255, 255, 255, 
255, 255] okay

   char [7] d7 = "x";
   writeln (cast (ubyte [7]) d7); // [120, 0, 0, 0, 0, 0, 0] 
would have expected
  // [120, 255, 255, 255, 255, 
255, 255]

}
~~~

~~~i3.d
// i3.d
void main ()
{
   string s = "x";
   static assert (is (typeof (s) == typeof ("x")));
   assert (s == "x");
   char [7] c7 = s; // throws RangeError
}

$ dmd -g i3
$ ./i3
core.exception.RangeError@i3.d(7): Range violation

??:? _d_arrayboundsp [...]
i3.d:7 _Dmain [...]
~~~

Shall I file them to bugzilla?


Static arrays really don't get any love :(

I also recently filed a bug:
https://issues.dlang.org/show_bug.cgi?id=22198

I think you should also file these ones.
If they're wrong, it'll just get ```RESOLVED INVALID```. Even 
better, someone here can tell why the above mentioned behaviours 
aren't bugs and you can just do it yourself.





partial initialization of fixed size ("static") arrays

2021-08-14 Thread kdevel via Digitalmars-d-learn
Today I stumbled across three issues with partial initialization 
of "static" arrays:


~~~i1.d
void main ()
{
   char [7] b = [ 1: 'x' ]; // okay
   char [7] a = [ 0: 'x' ]; // i1.d(4): Error: mismatched array 
lengths, 7 and 1

}
~~~

~~~i2.d
import std.stdio;

void main ()
{
   char [7] c7 = [ 1: 'x' ];
   writeln (cast (ubyte [7]) c7); // [255, 120, 255, 255, 255, 
255, 255] okay

   char [7] d7 = "x";
   writeln (cast (ubyte [7]) d7); // [120, 0, 0, 0, 0, 0, 0] 
would have expected
  // [120, 255, 255, 255, 255, 
255, 255]

}
~~~

~~~i3.d
// i3.d
void main ()
{
   string s = "x";
   static assert (is (typeof (s) == typeof ("x")));
   assert (s == "x");
   char [7] c7 = s; // throws RangeError
}

$ dmd -g i3
$ ./i3
core.exception.RangeError@i3.d(7): Range violation

??:? _d_arrayboundsp [...]
i3.d:7 _Dmain [...]
~~~

Shall I file them to bugzilla?