DMD fail when using both reflection and UDA

bioinfornatics via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jun 1 09:02:47 PDT 2014


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;
}


More information about the Digitalmars-d-learn mailing list