int delegate(int delegate(ref int)) doIter() const
  {
74      return (int delegate(ref int) dg)
      {
        cast(typeof(this))(this).doIter()
77            (
78              (ref int i)
              {
                int copy = i; dg(copy);
              }
          );
      } 
  }

I see what you are doing there. Unfortunately, the innermost delegate (the one doing the copy trick) somehow got @system attribute, which leads to the following compile errors (I added line numbers and reordered your code in the citation above):

constiter.d(78): Error: cannot implicitly convert expression (__dgliteral2) of type void delegate(ref int i) @system to int delegate(ref int) constiter.d(77): Error: cast has no effect in expression (cast(const(Container))this.doIter()((__error))) constiter.d(74): Error: cannot implicitly convert expression (__dgliteral1) of type void delegate(int delegate(ref int) dg) @system to int delegate(int delegate(ref int))

Where does this @system come from? How do I get rid of it?

Until
int delegate(ref inout int) opApply() inout;
and
int delegate(int delegate(ref inout int)) doIter() inout;
are made to work. (I actually don't know if there is any obstacles to do this).

Can you point me to the bugreport so I can vote for it? I'm not sure if it is #4838 or if they are unrelated.

Reply via email to