Order of static this() execution?
Steven Schveighoffer
schveiguy at gmail.com
Mon Feb 24 14:25:21 UTC 2020
On 2/23/20 6:55 AM, drathier wrote:
> On Sunday, 23 February 2020 at 11:41:25 UTC, Johan Engelen wrote:
>> On Sunday, 23 February 2020 at 09:59:45 UTC, drathier wrote:
>>> I'm having some trouble with the order in which `static this()` runs.
>>> This is the order defined in the source file, numbered for convenience:
>>
>> To avoid confusion: you have all `static this()` in a single source
>> file? Or across several source files?
>>
>> -Johan
>
> They're all in a single source file. The `[template]` prints are inside
> templates, like this:
>
> ```
> template none(msg) {
> T!(msg) none;
> static this() {
> none = ((std.functional.toDelegate(&batch!(msg) )))(X!(T!(msg) ));
> }
> }
> ```
>
> The whole reason I have `static this()` is to avoid ctfe crashing from
> trying to run `toDelegate` at compile time:
>
> ```
> std/functional.d(1501,22): Error: dummyDel.funcptr cannot be evaluated
> at compile time
> ```
The static this is run in lexical order, but template static this are
run as if they were stuck into the code at the first part they were
instantiated.
So for instance, if you have:
template T() {
int* T;
static this() {
T = new int;
}
}
int x;
static this() {
x = *T!();
}
The T instantiation comes AFTER the module-level static this. So it will
run the module static this first, and then the T static this.
How to fix this? I tried putting the template into a separate module.
Technically, the static constructor will be inserted into the
instantiating module. But it does seem to order it properly in that case.
This is a limitation that I think D should be able to resolve.
I'll file an issue report.
-Steve
More information about the Digitalmars-d-learn
mailing list