Bug 23104 – case where use of mixin() is rejected but use of the mixin content as code is not

Status
RESOLVED
Resolution
INVALID
Severity
normal
Priority
P1
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2022-05-12T08:50:21Z
Last change time
2022-05-12T09:18:11Z
Keywords
accepts-invalid
Assigned to
No Owner
Creator
Basile-z

Comments

Comment #0 by b2.temp — 2022-05-12T08:50:21Z
this does not work: ``` module self; import self; enum getMember = `__traits(getMember, sym, m)`; template printMembers(alias sym) { static foreach (m; __traits(allMembers, sym)) { pragma(msg, __traits(identifier, mixin(getMember))); static if (is(mixin(getMember)==module) || // HERE is(mixin(getMember)==class) || // HERE is(mixin(getMember)==struct)) // HERE { alias _ = printMembers!(mixin(getMember), m); // ERROR HERE } } } void main() { alias _ = printMembers!(mixin(__MODULE__)); } ``` but this does ``` module self; import self; enum getMember = `__traits(getMember, sym, m)`; template printMembers(alias sym) { static foreach (m; __traits(allMembers, sym)) { pragma(msg, __traits(identifier, mixin(getMember))); static if (is(__traits(getMember, sym, m)==module) || // HERE is(__traits(getMember, sym, m)==class) || // HERE is(__traits(getMember, sym, m)==struct)) // HERE { alias _ = printMembers!(mixin(getMember), m); // NO CHANGE HERE BUT WORKS } } } void main() { alias _ = printMembers!(mixin(__MODULE__)); } ```
Comment #1 by b2.temp — 2022-05-12T08:57:58Z
actually compilation fails/succeeds only depending on is(mixin(getMember)==module VS is(__traits(getMember, sym, m)==module
Comment #2 by b2.temp — 2022-05-12T09:18:11Z
also the version that compiles should not alias _ = printMembers!(mixin(getMember), m); but printMembers takes only one template type parameter