On Tuesday, 17 November 2015 at 11:26:19 UTC, Marc Schütz wrote:


That really depends on the details, that's why I asked. It could be a regression, or it could be that the compiler now does stricter checking than before, and your implementation wasn't completely correct, or it could be a bug in Phobos if you use that to create the range.

If you can post a minimal example that works in 2.067.1, but doesn't with the current version, I can try to find the change that broke it.

I did just that and I could find the culprit. It's opIndex(). It works up until 2.068.0, with 2.068.1 I already get this error:

"primitives.d(7): Error: invalid foreach aggregate doSomething(items).opIndex()"

Here's the example:

=========================

import std.stdio : writeln;
import std.range.primitives;

void main()
{
  string[] items = ["a", "b", "c"];
  foreach (ref it; items.doSomething())
  {
    writeln(it);
  }
}

auto doSomething(InputRange)(ref InputRange r)
{
  struct DoSomething
  {
    private
    {
      InputRange r;
      size_t cnt;
    }

    this(InputRange r)
    {
      this.r = r;
    }

    @property bool empty()
    {
      return r.length == 0;
    }

    @property auto front()
    {
      return r[0];
    }

    @property void popFront()
    {
      r = r[1..$];
    }

    @property size_t length() const
    {
      return r.length;
    }

    @property size_t opIndex()
    {
      return cnt;
    }

    @property auto save() const
    {
        return this;
    }
  }

  return DoSomething(r);
}


Reply via email to