digitalmars.D.bugs - [Issue 18422] New: String members and parameters cannot be mixed in,
- d-bugmail puremagic.com (53/53) Feb 11 2018 https://issues.dlang.org/show_bug.cgi?id=18422
https://issues.dlang.org/show_bug.cgi?id=18422 Issue ID: 18422 Summary: String members and parameters cannot be mixed in, even during CTFE Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: enhancement Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: andrei erdani.com This limits what can be done with CTFE and forces a variety of compile-time data structures and functions to be complicated templates without necessity. Consider a simple module introspection structure: struct Module { string name; string[] allMembers() { assert(__ctfe); mixin("immutable result = [ __traits(allMembers, " ~ name ~ ") ];"); return result; } } unittest { enum x = Module("std.typecons").allMembers; } The error is "value of this is not known at compile time". But it can, because this is itself a compile-time value. Passing the string as a parameter doesn't help either: struct Module { string[] allMembers(string name) { assert(__ctfe, "Can only be invoked during compilation"); mixin("immutable result = [ __traits(allMembers, " ~ name ~ ") ];"); return result; } } unittest { enum x = Module().allMembers("std.typecons"); } Here the error is "variable name cannot be read at compile time". Again that should work because the code is being evaluated during compilation. In this case the cure is simple - make Module a template parameterized on the module name/alias. But the matter gets a lot more problematic when trying to represent e.g. "all function declarations in this module". --
Feb 11 2018