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