What type does byGrapheme() return?
H. S. Teoh
hsteoh at quickfur.ath.cx
Mon Dec 30 23:38:31 UTC 2019
On Mon, Dec 30, 2019 at 03:31:31PM -0800, H. S. Teoh via Digitalmars-d-learn wrote:
> On Mon, Dec 30, 2019 at 03:09:58PM -0800, H. S. Teoh via Digitalmars-d-learn wrote:
> > I suspect the cause is that whatever Grapheme.opSlice returns is
> > going out-of-scope when used with .map, that's why it's
> > malfunctioning.
> Haha, it's actually right there in the Grapheme docs for the opSlice
> Random-access range over Grapheme's $(CHARACTERS).
> Warning: Invalidates when this Grapheme leaves the scope,
> attempts to use it then would lead to memory corruption.
> Looks like when you use .map over the Grapheme, it gets copied into a
> temporary, which gets invalidated when map.front returns. Somewhere
> we're missing a 'scope' qualifier...
Indeed, compiling with dmd -dip1000 produces this error message:
test.d(15): Error: returning g.opSlice() escapes a reference to parameter g, perhaps annotate with return
/usr/src/d/phobos/std/algorithm/iteration.d(499): instantiated from here: MapResult!(__lambda1, Grapheme)
test.d(15): instantiated from here: map!(Grapheme)
Not the most helpful message (the annotation has to go in Phobos code,
not in user code), but it does at least point to the cause of the
What doesn't kill me makes me stranger.
More information about the Digitalmars-d-learn