DMD 2.092 and DIP 25

Steven Schveighoffer schveiguy at gmail.com
Sat May 30 16:14:34 UTC 2020


On 5/30/20 3:00 AM, Mike Parker wrote:
> The following declarations now give a deprecation warning:
> 
> ```d
> struct ErrorInfo {
> private:
>      char[32] _error;
>      char[96] _message;
> 
> public @nogc nothrow @property:
>      /**
>          Returns the string "Missing Symbol" to indicate a symbol load 
> failure, and
>          the name of a library to indicate a library load failure.
>      */
>      const(char)* error() const { return _error.ptr; }
> 
>      /**
>          Returns a symbol name for symbol load failures, and a 
> system-specific error
>          message for library load failures.
>      */
>      const(char)* message() const { return _message.ptr; }
> }
> ```
> 
> I find it rather annoying, as I'm returning `const(char)*` and not 
> `char*`, but it is what it is. My question is, if I add `return` to the 
> function declarations, will this compile all the way back to DMD 2.067 
> *without* `-preview=dip25`? It works on 2.091.0. I always assumed a 
> preview feature's syntax wasn't supported without the preview switch.

I had to run the code to see the warning to understand what you meant.

Here is the warning:

onlineapp.d(11): Deprecation: returning &this._error escapes a reference 
to parameter this, perhaps annotate with return
onlineapp.d(17): Deprecation: returning &this._message escapes a 
reference to parameter this, perhaps annotate with return

This is not about const or not, it's about lifetime management.

For example, this would return a pointer to a stack frame that is about 
to go away:

const(char)* foo()
{
    ErrorInfo info;
    return info.message;
}

I know that you have already fixed the problem, but I wanted to make 
sure you understood why the compiler is complaining.

-Steve


More information about the Digitalmars-d-learn mailing list