|Posted by tastyminerals|
in reply to tastyminerals
Posted in reply to tastyminerals
On Monday, 7 June 2021 at 11:29:44 UTC, tastyminerals wrote:
On Monday, 7 June 2021 at 10:36:23 UTC, Mike Parker wrote:
On Monday, 7 June 2021 at 09:29:08 UTC, tastyminerals wrote:
import/core/sync/mutex.d(87,36): Error: `pthread_mutexattr_init` cannot be interpreted at compile time, because it has no available source code
compile time error. One of those D exceptions which doesn't say where it happened in your code so you need to comment out the lines that might cause it one by one :D
I found that this was caused by the "FileLogger" which I create at the top of the file. But why?
You can't initialize classes at module scope. You can declare them, but then they must be initialized in a function or a module constructor. Normally for a type
MyClass in module
foo, you'd see an error like this:
Error: variable `foo.MyClass` is a thread-local class and cannot have a static initializer. Use `static this()` to initialize instead.
I guess CTFE runs before the check that catches this, though, and the
FileLogger constructor ultimately triggers the error your seeing.
I see, I only remember that one cannot create associative arrays in global scope. This is explicitly written in the language reference.
It's interesting how there is no information about class instantiation at module level anywhere in the docs. Even the Ali's book does not explicitly say that you cannot instantiate a class this way. Maybe I totally missed it but just doing the key search on "scope", "global", "module" in class related chapters didn't give me any results.