Thread overview
variable _param_0 cannot be read at compile time
Aug 08, 2018
learnfirst1
Aug 08, 2018
learnfirst1
Aug 08, 2018
Simen Kjærås
Aug 09, 2018
learnfirst1
Aug 09, 2018
Kagamin
Aug 10, 2018
learnfirst1
August 08, 2018
Why this is a error ?

```
struct S {
        bool v;
        string x;
}

S* add(A...)(ref A a) {
        __gshared s = S(a);
        return &s;
}

void main(){
        auto p = add(true);
}
```

test.d(9): Error: variable _param_0 cannot be read at compile time
test.d(14): Error: template instance `test.add!bool` error instantiating
test.d(14): Error: function test.add!bool.add(ref bool _param_0) is not callable using argument types (bool)
test.d(14):        cannot pass rvalue argument true of type bool to parameter ref bool _param_0



I try pass some into the template to return a __gshared var pointer.  the A length is dynamic.



August 08, 2018
On Wednesday, 8 August 2018 at 12:57:43 UTC, learnfirst1 wrote:
> Why this is a error ?
>

this code example can explain what I am try to do here:

struct M {
        int i;
        S*[100] s;
}
struct S {
        M* mp;
        bool x;
}


S* add(A...)(ref A a) {
        __gshared s = S(a);
        alias m = a[0];
        m.s[m.i++] = &s;
        return &s;
}

void main(){
        __gshared M m = M(0);
        __gshared S s = S(&m, false);
        m.s[m.i++] = &s;
        auto p = add(&m, true);  // variable _param_0 cannot be read at compile time
}

because S has the optional ctor parameters, I can not use template alias param here( some how not work) .



August 08, 2018
On Wednesday, 8 August 2018 at 12:57:43 UTC, learnfirst1 wrote:
> Why this is a error ?
>
> ```
> struct S {
>         bool v;
>         string x;
> }
>
> S* add(A...)(ref A a) {
>         __gshared s = S(a);
>         return &s;
> }
>
> void main(){
>         auto p = add(true);
> }
> ```
>
> test.d(9): Error: variable _param_0 cannot be read at compile time

__gshared and static need to be initialized with a value known at compile-time. You're trying to give it a run-time value. You can set this after it's first created:

S* add(A...)(ref A a) {
    __gshared S s;
    s = S(a);
    return &s;
}

That's a little kludgy, but apparently that's how it be.

You also get another error message:
> Error: function test.add!bool.add(ref bool _param_0) is not callable using argument types (bool)

That's because add takes its arguments by ref, and true is a literal that has no canonical address, and thus can't be passed by ref. You might consider using auto ref.

--
  Simen
August 09, 2018
On Wednesday, 8 August 2018 at 13:13:42 UTC, Simen Kjærås wrote:
> On Wednesday, 8 August 2018 at 12:57:43 UTC, learnfirst1 wrote:
>> Why this is a error ?
>>
>> ```
>> struct S {
>>         bool v;
>>         string x;
>> }
>>
>> S* add(A...)(ref A a) {
>>         __gshared s = S(a);
>>         return &s;
>> }
>>
>> void main(){
>>         auto p = add(true);
>> }
>> ```
>>
>> test.d(9): Error: variable _param_0 cannot be read at compile time
>
> __gshared and static need to be initialized with a value known at compile-time. You're trying to give it a run-time value. You can set this after it's first created:
>
> S* add(A...)(ref A a) {
>     __gshared S s;
>     s = S(a);
>     return &s;
> }
>
> That's a little kludgy, but apparently that's how it be.
>
> You also get another error message:
>> Error: function test.add!bool.add(ref bool _param_0) is not callable using argument types (bool)
>
> That's because add takes its arguments by ref, and true is a literal that has no canonical address, and thus can't be passed by ref. You might consider using auto ref.
>
> --
>   Simen

is there a way to pass A a... as alias into template ? so the code can be just like this:

__gshared S s = S(&m, false);


the binary size is short since in this case the s is static build int. and run a bit fast.

August 09, 2018
struct M {
        int i;
        S*[100] s;
}
struct S {
        M* mp;
        bool x;
}

S* add(A...)() {
        alias m = A[0];
        __gshared s = S(&m,A[1..$]);
        m.s[m.i++] = &s;
        return &s;
}

void main(){
        __gshared M m = M(0);
        __gshared S s = S(&m, false);
        m.s[m.i++] = &s;
        auto p = add!(m, true);
}
August 10, 2018
On Thursday, 9 August 2018 at 13:42:03 UTC, Kagamin wrote:
> struct M {
>         int i;
>         S*[100] s;
> }
> struct S {
>         M* mp;
>         bool x;
> }
>
> S* add(A...)() {
>         alias m = A[0];
>         __gshared s = S(&m,A[1..$]);
>         m.s[m.i++] = &s;
>         return &s;
> }
>
> void main(){
>         __gshared M m = M(0);
>         __gshared S s = S(&m, false);
>         m.s[m.i++] = &s;
>         auto p = add!(m, true);
> }

this is what I want! thanks.