On 12/7/2017 3:41 PM, Nicholas Wilson wrote:
On Thursday, 7 December 2017 at 21:32:24 UTC, Walter Bright wrote:
On 12/7/2017 2:07 AM, Nicholas Wilson wrote:
Doesn't work for templates.
I don't know how your code is organized, but if the template is instantiated
in another file, it won't have code generated for it either.
As a trivial example:
bar.d:
module bar;
string generatesMixin(T)()
{
return T.stringof ~ " foo;";
}
a.d:
@compute(CompileFor.deviceOnly) module a;
int baz()
{
mixin(generatesMixin!int());
return foo;
}
a's symbol table contains `baz` and `generatesMixin!int`. generateMixin deals
with strings which are not allowed (global variables are unsupported). This
would fail compilation. If `generatesMixin` were to be marked `@ctfeonly`, this
would pass.
bar.d:
module bar;
string generateString(T)()
{
return T.stringof ~ " foo;";
}
enum s = generateString!int();
a.d:
@compute(CompileFor.deviceOnly) module a;
int baz()
{
import bar;
bar.s;
return foo;
}