On Monday, 7 November 2016 at 20:24:25 UTC, Jonathan M Davis
wrote:
That's a matter of debate. What you're saying is that the
contract for the function requires certain conditions be true
for the function arguments, and if they are true, then the
function is @safe. And that's legitimate. But at the same time,
it doesn't absolutely guarantee @safety, because if the caller
passes arguments that violate the contract, and the function is
compiled with -release, then unsafe things will occur. So, you
could mark the function as @system, and then make it clear in
the documentation that the function's @safety depends on the
function's arguments meeting the pre-condition. So, the caller
then knows when they can mark the call as being @trusted.
There have been several discussions about @trusted over the
last couple of years (both in the newsgroup and on github), and
I don't know what the official stance on this sort of thing
currently is. I know that at one point, it was argued that
@trusted functions were @safe so long as their arguments were
valid, but then you get stuff like
auto foo(int* arr, size_t index) @trusted
{
return *(arr + index);
}
or
auto foo(int* arr, size_t length) @trusted
{
return arr[0 .. length];
}
or
auto foo(int[], size_t index) @trusted
{
return *(arr.ptr + index);
}
and it doesn't seem like a good idea to me to mark functions
like that as @trusted. It's too much like you're trying to have
array indexing be marked as @trusted while circumventing the
array bounds checks without any guarantee that the values are
going to be valid.
All pure functions which a programmer, save for a blackhat
perhaps, has any reason to use are @safe with correct arguments.
So we would have no use for @safe when we have @pure, were that
argument about arguments wise to follow. So I agree with you that
they definitely would be a bad idea without contracts. However,
with contracts, as you said, it is less clear.
So, while I don't know what the official stance is, I'd suggest
having the function be @trusted and having the documentation
make it clear what the preconditions are so that the calling
function can be marked @trusted.
- Jonathan M Davis
I reckon you meant marking the calling function @safe?