Bug 18386 – mixin ... isn't a template error when used in new scope

Status
NEW
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2018-02-06T22:30:31Z
Last change time
2024-12-13T18:56:49Z
Assigned to
No Owner
Creator
tetyys
Moved to GitHub: dmd#19382 →

Comments

Comment #0 by tetyys — 2018-02-06T22:30:31Z
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
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