Compilation of this code:
import std.stdio;
void main() { }
class c {
this() {
enum string b(alias d)() {
return `writeln("a");`;
}
int a;
{
mixin b!a;
mixin b!a;
}
}
}
fails with dmd v2.078.1 and error
test.d(11): Error: mixin b!a b isn't a template
However, code:
import std.stdio;
void main() { }
class c {
this() {
enum string b(alias d)() {
return `writeln("a");`;
}
int a;
//{
mixin b!a;
mixin b!a;
//}
}
}
compiles successfully
Comment #1 by nick — 2022-05-30T13:55:17Z
Is a function allowed to return an `enum string`? Shouldn't you use one of these:
string b(alias d)() {
return `writeln("a");`;
}
enum string b(alias d) = `writeln("a");`;
I think this should be marked `accepts-invalid`.
Comment #2 by nick — 2022-05-30T13:58:22Z
Also you should use a string mixin, `mixin(b!a);` - not a template mixin.
Comment #3 by nick — 2022-06-02T15:25:54Z
I think mixing in an eponymous template should be an error as it is confusing. Reduced:
void main() {
template b(alias d) {
enum b = ``;
}
int a;
{
pragma(msg, is(typeof(b) == string)); // false
mixin b!a;
pragma(msg, is(typeof(b) == string)); // true
mixin b!a; // error
}
}
As before, if the {} scope block braces are removed, there's no error.
Comment #4 by robert.schadek — 2024-12-13T18:56:49Z