D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 12532 - __traits(compiles, ...) fails to see valid enum symbols
Summary: __traits(compiles, ...) fails to see valid enum symbols
Status: NEW
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P3 normal
Assignee: No Owner
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2014-04-06 16:23 UTC by det
Modified: 2024-12-13 18:19 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description det 2014-04-06 16:23:40 UTC
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 monarchdodra 2014-04-06 23:09:32 UTC
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 det 2014-04-07 07:20:53 UTC
(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 dlangBugzillaToGithub 2024-12-13 18:19:33 UTC
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