New names - 2.068 roundup

Adam D. Ruppe via Digitalmars-d digitalmars-d at puremagic.com
Wed Jun 24 20:40:29 PDT 2015


On Thursday, 25 June 2015 at 03:12:47 UTC, Steven Schveighoffer 
wrote:
> A curious thing though. All the tests for things like:
>
> assert(setExtension("file", "ext") == "file.ext");
>
> do not trigger a call to eager.

But it passes? That's bizarre. (My dmd is apparently too old to 
compile this, it segfaults when I try!)

> assert(setExtension("file", "ext").array == "file.ext");

I did experience this in my proof-of-concept because I didn't 
implement .length. So when array checked hasLength, it found it 
through the alias this, which called eager. (That's also why I 
did a foreach loop instead of just returning array(this). Well, 
that and the auto-decode nonsense, but array would be a recursive 
call and stack overflow anyway).

But since you did implement a length function, that shouldn't be 
happening. Maybe it passes the check in StringTypeOf though: is(T 
: const char[]) might pass due to the alias this too. Not sure.

(An interesting point here though is since alias this DOES return 
a string, any duck-type checks or implicit conversion checks will 
also pass what it passes... and work, it'll just silently 
allocate the string. Which is no regression! The status quo is it 
allocates that string EVERY time anyway. But it also isn't ideal. 
Someone earlier said we can probably apply @nogc to everything 
but the eager method. I think that'd work, and then at least the 
allocations wouldn't be silent anymore - the @nogc attribute at 
the call site can catch them.)



These two things are weird, but I'm sure they're just bugs that 
we can handle. In the morning, I'll try a git dmd and see if I 
can play with it a little, right now I'm just guessing since it 
won't build on my current setup.


More information about the Digitalmars-d mailing list