[Issue 7476] Write(ln) functions no longer accept retro range

d-bugmail at puremagic.com d-bugmail at puremagic.com
Fri Feb 10 04:55:09 PST 2012


http://d.puremagic.com/issues/show_bug.cgi?id=7476


Kenji Hara <k.hara.pg at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|nobody at puremagic.com        |andrei at metalanguage.com


--- Comment #7 from Kenji Hara <k.hara.pg at gmail.com> 2012-02-10 04:55:04 PST ---
A shallow answer:
2.058 was merged a pull to improve std.format:
https://github.com/D-Programming-Language/phobos/pull/298
and after that this regression has been occurred.

A deep answer:
This is a problem rooted in the std.range.put implementation.
reduced code:
----
import std.range;

struct LockingTextWriter
{
    void put(dchar c){}
}
struct RetroResult
{
    bool end = false;
    @property bool empty() const { return end; }
    @property dchar front(){ return 'a'; }
    void popFront(){ end = true; }
}
void main()
{
    LockingTextWriter w;
    RetroResult r;
    put(w, r);  // test.d(20)
}

Output:
----
C:\dmd2\src\phobos\std\range.d(295): Error: static assert  "Cannot put a
RetroResult into a LockingTextWriter"
test.d(20):        instantiated from here: put!(LockingTextWriter,RetroResult)

Current std.format.formatValue treats retro("abcd") as a kind of string range.
And try to put it into Writer by using std.range.put().

  void put(R, E)(ref R r, E e)     // std.range.put signature

When E is an array (of cause it is random access range), put() runs the
range-to-range copy. But put() cannot instantiate with E that isn't array
range.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list