Bug 12532 – __traits(compiles, ...) fails to see valid enum symbols

Status
NEW
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2014-04-06T16:23:40Z
Last change time
2024-12-13T18:19:33Z
Assigned to
No Owner
Creator
det
Moved to GitHub: dmd#18812 →

Comments

Comment #0 by 2krnk — 2014-04-06T16:23:40Z
under certain circumstances, eg when called from a template using mixin and static if, __traits(compiles, ...) fails to see valid enum symbols. (if 'enum' in following example is replaced by 'const bool' or 'immutable bool' all symbols are found.) === EXAMPLE === template valid(string mem){ pragma(msg, "instantiation of 'valid' with: "~mem); static if( !__traits( compiles, mixin(mem) ) ){ enum valid = false; }else{ enum valid = true; } } enum ok = valid!"works"; pragma(msg, "found 'works'? "~ok.stringof ); // true - fine, recognizes 'works' later in module scope enum foo = valid!"bar"; pragma(msg, "found 'bar'? "~foo.stringof ); // true - fine, recognizes 'bar' laterin module scope enum bar = valid!"foo"; pragma(msg, "found 'foo'? "~bar.stringof ); // false - fails to see 'foo' earlier in module scope! enum works = true; void main(){}
Comment #1 by monarchdodra — 2014-04-06T23:09:32Z
Reduced: //---- enum a = is(typeof(b)); enum b = is(typeof(a)); pragma(msg, a); //true pragma(msg, b); //false //---- I'm not sure this is actually resolvable...?
Comment #2 by 2krnk — 2014-04-07T07:20:53Z
(In reply to comment #1) > Reduced: > > //---- > enum a = is(typeof(b)); > enum b = is(typeof(a)); > > pragma(msg, a); //true > pragma(msg, b); //false > //---- > > I'm not sure this is actually resolvable...? sorry, i should have reduced it to enum a = __traits(compiles, b); pragma(msg, a); // true enum b = __traits(compiles, a); pragma(msg, b); // false guess i was too preoccupied with issue 12533. however, i think b should be true, __traits(compiles, ...) should not need the value or type of a. in other words, it should be able to see that a symbol is defined without caring what it actually is. as a matter of fact, in enum c; pragma(msg, typeof(c)); // _error_ pragma(msg, is(typeof(c)) ); // false enum d = __traits(compiles, c); pragma(msg, d); // true this is kinda happening.
Comment #3 by robert.schadek — 2024-12-13T18:19:33Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/18812 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB