CTFE in imported static initializers

Steven Schveighoffer schveiguy at gmail.com
Mon May 13 20:39:57 UTC 2019


I have just discovered an interesting behavior, and I'm wondering if 
this behavior is intentional or even necessary.

Let's say I have this module called mod2.d:

module mod2;

string buildModData()
{
     string result;
     foreach(i; 0 .. 10000)
         result = result ~ "lots and lots and lots of data";
     return result;
}

static moddata = buildModData();

OK, so building this with -c on my system takes about 1 second of time:

Stevens-MacBook-Pro:ctfetest steves$ time dmd -c mod2.d

real	0m0.994s
user	0m0.434s
sys	0m0.554s


Now, I make a new module mod1.d:

module mod1;

import mod2;

And...

Stevens-MacBook-Pro:ctfetest steves$ time dmd -c mod1.d

real	0m0.993s
user	0m0.435s
sys	0m0.553s


This is because the CTFE engine is re-evaluating the static initializer, 
and then basically, throwing it away.

Why? I can't even use it at compile time...

pragma(msg, moddata.length);

mod1.d(5): Error: static variable moddata cannot be read at compile time
mod1.d(5):        while evaluating pragma(msg, moddata.length)

Why would the compiler re-run CTFE stuff that has already been run, or 
that at least it has no intention of using at compile time?

I found this because I'm trying to fix the import std.path issue (with 
-unittest on). I found this kind of stuff happening in phobos.

Does anyone have a good answer for why this should happen, or should I 
file a bug?

-Steve


More information about the Digitalmars-d-learn mailing list