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(){}
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...?
(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.
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