DMD (dmdfe 2.066) fail when i use UDA which store a delegate


code below works if i remove @section UDA otheswise it give this
error:

dmd: statement.c:714: ErrorStatement::ErrorStatement(): Assertion
`global.gaggedErrors || global.errors' failed.


is a bug  ?



------- CODE also on dpaste http://dpaste.dzfl.pl/3a3d660bd3bc
--------
import std.stdio;
import std.typecons : Tuple;
import std.typetuple : Filter;


struct attribute{}

@attribute
struct section( alias start, alias end)
{
     alias checkStart = start;
     alias checkEnd = end;
}

template hasSection(T)
{
     static bool helper()
     {
         foreach(memberName; __traits(allMembers, T))
         {
             foreach(attr; __traits(getAttributes,
__traits(getMember, T, memberName)))
             {
                 static if(is(attr == Section))
                     return true;
             }
         }
         return false;
     }

     enum hasSection = helper();
}

struct Data{
     @section!( ( words ) =>  words[0] == '@'                 , (
words ) =>  words[0] == '\n' )
     string a;
     @section!( ( words ) =>  words[0] > 63 && words[0] <115  , (
words ) =>  words[0] == '\n' )
     string b;
     @section!( ( words ) =>  words[0] == '+'                 , (
words ) =>  words[0] == '\n' )
     string c;
}

template toTuple(T){
     static string maker(){
         string statement = "alias toTuple = Tuple!(";
         foreach(const memberName; __traits(allMembers, T)){
             //~ mixin(`alias f = Filter!(hasSection,
__traits(getAttributes, T.` ~ memberName ~ `));`);
             statement ~=  typeof(__traits(getMember, T,
memberName)).stringof  ~ ",\"" ~ memberName ~ "\", " ;
         }
         statement = statement[0..$-2] ~ ") ;" ; // $-2 to remove
extra comma
         return statement;
     }
     mixin( maker() );
}


void main()
{
     alias A = toTuple!Data;
     A a;
     a[0] = 1;
     a.x = 1;
}

Reply via email to