Bug 10100 – Identifiers with double underscores and allMembers
Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-05-16T19:38:03Z
Last change time
2020-02-20T21:56:50Z
Keywords
pull
Assigned to
No Owner
Creator
Maxim Fomin
Comments
Comment #0 by maxim — 2013-05-16T19:38:03Z
After fixing issue 10096 following code
struct S
{
void __aggrPostBlit(){}
void __aggrPostBlit_blah(){}
this(int x){}
}
pragma(msg, __traits(allMembers, S));
void main(){}
prints only __ctor
I think either dmd should grep special names from sources (and not just compare first two characters for underscores) or ban __identifiers at all.
Comment #1 by gooberman — 2016-11-29T13:17:21Z
Just hit this myself. Another case of allMembers not returning all members.
Comment #2 by ibuclaw — 2017-06-11T09:04:10Z
This bug also means you can't pull a list of all gdc builtins at compile time, all to which are prefixed with `__builtin_'.
i.e:
---
import gcc.builtins;
enum builtins = [__traits(allMembers, gcc.builtins)];
pragma(msg, builtins); // prints ["object"]
@ibuclaw created dlang/dmd pull request #10697 "fix Issue 10100 - Identifiers with double underscores and allMembers" fixing this issue:
- fix Issue 10100 - Identifiers with double underscores and allMembers
Convert the identifier whitelist into a blacklist of all possible
internal D language declarations.
https://github.com/dlang/dmd/pull/10697
Comment #5 by dlang-bot — 2019-12-26T02:41:01Z
dlang/dmd pull request #10697 "fix Issue 10100 - Identifiers with double underscores and allMembers" was merged into master:
- 3aa3da224f6e6b075de0ddfb2416c52ee90f049c by Iain Buclaw:
fix Issue 10100 - Identifiers with double underscores and allMembers
Convert the identifier whitelist into a blacklist of all possible
internal D language declarations.
https://github.com/dlang/dmd/pull/10697
Comment #6 by dlang-bot — 2020-02-20T21:56:50Z
dlang/dmd pull request #10791 "[dmd-cxx] Implement static foreach, aliasing traits, and fix allMembers." was merged into dmd-cxx:
- 2c7947d0507d34e0f72899e9835b88ddf19c31e1 by Iain Buclaw:
[dmd-cxx] Implement static foreach, aliasing traits, and fix allMembers.
----
Implement DIP 1010 - (Static foreach)
Support for `static foreach` has been added.
`static foreach` is a conditional compilation construct that is to `foreach` what `static if` is to `if`.
It is a convenient way to generate declarations and statements by iteration.
```
import std.conv: to;
static foreach(i; 0 .. 10)
{
// a `static foreach` body does not introduce a nested scope
// (similar to `static if`).
// The following mixin declaration is at module scope:
mixin(`enum x` ~ to!string(i) ~ ` = i;`); // declares 10 variables x0, x1, ..., x9
}
import std.range: iota;
// all aggregate types that can be iterated with a standard `foreach`
// loop are also supported by static foreach:
static foreach(i; iota(10))
{
// we access the declarations generated in the first `static foreach`
pragma(msg, "x", i, ": ", mixin(`x` ~ to!string(i)));
static assert(mixin(`x` ~ to!string(i)) == i);
}
void main()
{
import std.conv: text;
import std.typecons: tuple;
import std.algorithm: map;
import std.stdio: writeln;
// `static foreach` has both declaration and statement forms
// (similar to `static if`).
static foreach(x; iota(3).map!(i => tuple(text("x", i), i)))
{
// generates three local variables x0, x1 and x2.
mixin(text(`int `,x[0],` = x[1];`));
scope(exit) // this is within the scope of `main`
{
writeln(mixin(x[0]));
}
}
writeln(x0," ",x1," ",x2); // first runtime output
}
```
----
Aliases can be created directly from a `__trait`.
Aliases can be created directly from the traits that return symbol(s) or tuples.
This includes `getMember`, `allMembers`, `derivedMembers`, `parent`, `getOverloads`,
`getVirtualFunctions`, `getVirtualMethods`, `getUnitTests`, `getAttributes` and finally `getAliasThis`.
Previously an `AliasSeq` was necessary in order to alias their return.
Now the grammar allows to write shorter declarations:
```
struct Foo
{
static int a;
}
alias oldWay = AliasSeq!(__traits(getMember, Foo, "a"))[0];
alias newWay = __traits(getMember, Foo, "a");
```
To permit this it was more interesting to include `__trait` in the basic types
rather than just changing the alias syntax. So additionally, wherever a type appears
a `__trait` can be used, for example in a variable declaration:
```
struct Foo { static struct Bar {} }
const(__traits(getMember, Foo, "Bar")) fooBar;
static assert(is(typeof(fooBar) == const(Foo.Bar)));
```
----
fix Issue 10100 - Identifiers with double underscores and allMembers
Convert the identifier whitelist into a blacklist of all possible
internal D language declarations.
https://github.com/dlang/dmd/pull/10791