Template instantiation fails on Linux, succeeds on Windows

Steven Schveighoffer schveiguy at yahoo.com
Fri May 18 13:57:32 UTC 2018


On 5/17/18 7:33 PM, Bastiaan Veelo wrote:
> On Thursday, 17 May 2018 at 23:18:32 UTC, Basile B. wrote:
>> On Thursday, 17 May 2018 at 22:07:46 UTC, Bastiaan Veelo wrote:
>>> Hi!
>>>
>>> The code in [1] compiles and runs flawlessly on Windows, but not on 
>>> Linux (neither run.dlang nor Travis docker image). Any idea what can 
>>> be done?
>>
>> Hello. Yes, add `import core.stdc.stdarg;` in your module and it works.
>> I don't know why it's not required on windows, this is strange.
> 
> Great! Thanks a lot, Basile!
> 
> Seems there is room for improvement somewhere, a better error message at 
> the least.

Interestingly, the error was better before:

https://run.dlang.io/is/BgvH4w

Tested on all compilers, up to 2.072.1, it results in:

onlineapp.d(1): Error: '__va_argsave_t' is not defined, perhaps you need 
to import core.vararg; ?
onlineapp.d(1): Error: function onlineapp.foo must import core.vararg to 
use variadic functions

In 2.072.2, it starts saying:

Error: undefined identifier '__va_list_tag'

The previous error was much better, but this to me is a huge code smell. 
Why do we have to import certain modules to use actual language 
features? Just to *define* a function, but not do anything inside it? 
I'd understand if this was a linker error, but surely the compiler can 
know to auto-import something, or at least spit out the proper extern(C) 
declarations?

Note that your code works if I import core.vararg outside the function, 
you don't need core.stdc.stdarg. The import cannot be *inside* the function.

-Steve


More information about the Digitalmars-d-learn mailing list