Template overloads involving `string` and `char[constant]` return value

Johan Engelen via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Sep 21 05:07:31 PDT 2016


What's the bug in the following code:

```d
import std.digest.md;
import std.stdio;

pragma(inline, false) // just in case
string getHash()
{
     ubyte[16] hash = [1,2,3,4,5,6,6,78,8,8,7,7,6,3,2,3];
     string a = toHexString(hash);
     return a;
}

pragma(inline, false) // just in case
void destroystack()
{
     writeln("asd","asd","asd","asd","asd","asd");
}

void main()
{
     string a = getHash();
     destroystack();
     writeln(a);
}
```

Hint: when changing
```
     string a = toHexString(hash);
     return a;
```
to
```
     return toHexString(hash);
```
the compiler errors with:
`Error: escaping reference to stack allocated value returned by 
toHexString(hash)`.

So:
-  the documentation of toHexString says that the overloads 
returning a string return a GC allocated string
- the _implementation_ of `string toHexString(...)` does a `new 
char[16]`, so GC allocates.
- `string a = toHexString(hash);` calls `char[num*2] 
toHexString(...)` instead of `string toHexString(...)`.   OOPS.

https://issues.dlang.org/show_bug.cgi?id=16519

I don't know whether this is a compiler bug (choosing the wrong 
overload) or a Phobos bug (overloads don't work like that).
How are template overloads involving `string` and 
`char[constant]` return values supposed to work?

Still can't believe I am the first one to run into this, what am 
I doing wrong?

-Johan


More information about the Digitalmars-d-learn mailing list