www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - templates, enums, CT reflection: compiler bug or not?

reply captaindet <2krnk gmx.net> writes:
i stumbled upon something strange while wondering around meta/codegen-lands. it
took me almost a week to reduce it to the following test case. i have no clue
what is going on, whether i have entered bug territory or just encountered my
own limitations....

mind you, i have 2 issues with the code:
(1) that my template, which uses  __traits(compiles, ...), under certain
circumstances (aka 'if things are getting complicated') fails to see symbols
that one could argue are valid in this scope. (annoying maybe, but not my main

(2) the strange compiler error i get when using the template on itself, but
only if it is not the first time that the instantiation is used. this is my
real issue cause i don't know how to work around this. during my attempts to
reduce this, starting from much more complicated code, i encountered all sorts
of errors, including ICE and __error stuff.

so am i being stupid or is it a compiler bug?



module demo;

template valid(string mem){
     pragma(msg, "instantiation of valid with: "~mem);
     static if( !__traits( compiles, mixin(mem) ) ){
         enum valid = false;
         enum valid =  true;

enum ok = valid!"foo";
pragma(msg, ok );               // -> true // fine, recognizes 'foo' in module

enum works = valid!"fails";
pragma(msg, works );            // -> false // problematic, fails to see
'fails' in module scope

enum dummy = valid!"fails";
pragma(msg, dummy );            // -> false // same behavior, as long as you
are not testing yourself

enum fails = valid!"fails";     // Error: variable demo.fails had semantic
errors when compiling
// NOTE: if you comment out the first two usages of valid!"fails", it will work
// although it will result in "false"

//  pragma(msg, fails );

enum foo = 42;

void main(){}
Apr 04 2014
parent captaindet <2krnk gmx.net> writes:
no one any ideas?

well, i filed two bug reports for now:
Apr 06 2014