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

Reply via email to