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
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`.
Also you should use a string mixin, `mixin(b!a);` - not a template mixin.
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.
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19382 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB