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: [email protected]
Reporter: [email protected]
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".
--