Thread overview | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
August 14, 2018 is this a betterC bug ? | ||||
---|---|---|---|---|
| ||||
enum string[] a = ["a"]; extern(C) void main() { int i = 0; auto s = a[i]; } --------------- Error: TypeInfo cannot be used with -betterC |
August 14, 2018 Re: is this a betterC bug ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to learnfirst1 | On Tuesday, 14 August 2018 at 13:01:57 UTC, learnfirst1 wrote: > > enum string[] a = ["a"]; > > extern(C) void main() { > int i = 0; > auto s = a[i]; > } > --------------- > Error: TypeInfo cannot be used with -betterC Yes. https://issues.dlang.org/show_bug.cgi?id=19169 |
August 14, 2018 Re: is this a betterC bug ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nicholas Wilson | On Tuesday, 14 August 2018 at 13:16:50 UTC, Nicholas Wilson wrote:
> On Tuesday, 14 August 2018 at 13:01:57 UTC, learnfirst1 wrote:
>>
>> enum string[] a = ["a"];
>>
>> extern(C) void main() {
>> int i = 0;
>> auto s = a[i];
>> }
>> ---------------
>> Error: TypeInfo cannot be used with -betterC
>
> Yes. https://issues.dlang.org/show_bug.cgi?id=19169
This seems to be because dynamic array literals are allocated by default. So that is possibly not a bug, per se but the error message is definitely not helpful.
|
August 14, 2018 Re: is this a betterC bug ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to learnfirst1 | On Tuesday, 14 August 2018 at 13:01:57 UTC, learnfirst1 wrote: > > enum string[] a = ["a"]; > > extern(C) void main() { > int i = 0; > auto s = a[i]; > } > --------------- > Error: TypeInfo cannot be used with -betterC You can use `static immutable` as a workaround for now: https://run.dlang.io/is/7HEPst |
August 14, 2018 Re: is this a betterC bug ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to learnfirst1 | On Tuesday, 14 August 2018 at 13:01:57 UTC, learnfirst1 wrote: > > enum string[] a = ["a"]; > > extern(C) void main() { > int i = 0; > auto s = a[i]; > } > --------------- > Error: TypeInfo cannot be used with -betterC Workaround: https://run.dlang.io/is/NZykl0 Source: https://p0nce.github.io/d-idioms/ |
August 14, 2018 Re: is this a betterC bug ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Paul Backus | On Tuesday, 14 August 2018 at 16:31:38 UTC, Paul Backus wrote: > On Tuesday, 14 August 2018 at 13:01:57 UTC, learnfirst1 wrote: >> >> enum string[] a = ["a"]; >> >> extern(C) void main() { >> int i = 0; >> auto s = a[i]; >> } >> --------------- >> Error: TypeInfo cannot be used with -betterC > > Workaround: https://run.dlang.io/is/NZykl0 > > Source: https://p0nce.github.io/d-idioms/ FYI: staticArray will be part of 2.082, it already works with dmd-nightly: https://run.dlang.io/is/tC7tix |
August 14, 2018 Re: is this a betterC bug ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Seb | On Tuesday, 14 August 2018 at 17:22:42 UTC, Seb wrote:
> FYI: staticArray will be part of 2.082, it already works with dmd-nightly:
That just seems wrong. Isn't the fact that `staticArray` is needed a bug in the compiler? I think the compiler could have lowered to something like that automatically to avoid the library workaround.
Mike
|
August 15, 2018 Re: is this a betterC bug ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Franklin | On Tuesday, 14 August 2018 at 17:49:32 UTC, Mike Franklin wrote: > On Tuesday, 14 August 2018 at 17:22:42 UTC, Seb wrote: > >> FYI: staticArray will be part of 2.082, it already works with dmd-nightly: > > That just seems wrong. Isn't the fact that `staticArray` is needed a bug in the compiler? I think the compiler could have lowered to something like that automatically to avoid the library workaround. > > Mike It's not a bug, it's all about how the type system is set up. The type of an array literal expression like `[1, 2, 3]` is `int[]` (a slice of an array of ints), so no matter if you do: auto readonly(T)(const(T)[] x) { return x; } auto arr1 = [1, 2, 3]; auto arr2 = [1, 2, 3].readonly; const arr3 = [1, 2, 3]; enum arr4 = [1, 2, 3]; static immutable arr5 = [1, 2, 3]; scope arr6 = [1, 2, 3]; In all instances the type will be `int[]` modulo type qualifiers. Static arrays are completely different types, that just happen to accept assignments from slices. Their two defining properties are: 1. Their length is fixed at compile-time, meaning that you can do: import std.array, std.meta; auto x = [1, 2, 3, 4, 5].staticArray; enum length = x.length; pragma (msg, length); alias seq = AliasSeq!(0, 42, length); static foreach (i; 0 .. length) { } static foreach (i; seq) { } 2. Where slices are reference types, static arrays are value types which means that each assignment will copy an entire array. Basically they behave like a `struct { int _arr_0 = 0, _arr_1 = 1, _arr_2 = 2; }`. https://run.dlang.io/is/iD9ydu |
August 15, 2018 Re: is this a betterC bug ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Petar Kirov [ZombineDev] | On Wednesday, 15 August 2018 at 08:14:53 UTC, Petar Kirov [ZombineDev] wrote: > > https://run.dlang.io/is/iD9ydu I made a typo in one of the comments. Here's the fixed version: https://run.dlang.io/is/HRqYcZ |
August 15, 2018 Re: is this a betterC bug ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Petar Kirov [ZombineDev] | On Wednesday, 15 August 2018 at 08:14:53 UTC, Petar Kirov [ZombineDev] wrote:
> It's not a bug, it's all about how the type system is set up. The type of an array literal expression like `[1, 2, 3]` is `int[]` (a slice of an array of ints), so no matter if you do:
>
> auto readonly(T)(const(T)[] x) { return x; }
>
> auto arr1 = [1, 2, 3];
> auto arr2 = [1, 2, 3].readonly;
> const arr3 = [1, 2, 3];
> enum arr4 = [1, 2, 3];
> static immutable arr5 = [1, 2, 3];
> scope arr6 = [1, 2, 3];
>
> In all instances the type will be `int[]` modulo type qualifiers.
>
> Static arrays are completely different types, that just happen to accept
> assignments from slices. Their two defining properties are:
> 1. Their length is fixed at compile-time, meaning that you can do:
>
> import std.array, std.meta;
> auto x = [1, 2, 3, 4, 5].staticArray;
> enum length = x.length;
> pragma (msg, length);
> alias seq = AliasSeq!(0, 42, length);
> static foreach (i; 0 .. length) { }
> static foreach (i; seq) { }
>
>
> 2. Where slices are reference types, static arrays are value types which means that each assignment will copy an entire array.
>
> Basically they behave like a `struct { int _arr_0 = 0, _arr_1 = 1, _arr_2 = 2; }`.
>
> https://run.dlang.io/is/iD9ydu
Thanks for the detailed explanation; it make sense now.
Mike
|
Copyright © 1999-2021 by the D Language Foundation