Please, can the langauge stop inferring scope and return for @trusted/@system?
Dukc
ajieskola at gmail.com
Thu May 19 07:13:05 UTC 2022
First thing first, I'm talking about code with
`-preview=dip1000`. Make sure that is on if you test these.
There are times when you want to treat data in a scoped struct as
non-scoped. Example:
```D
struct MyType
{ // Struct designed so that this will never point to local data
private @system int* _content;
// This might.
int* otherPtr;
@trusted this(return ref int i)
{ _content = new int(i);
otherPtr = &i;
}
// Note, not marked RETURN scope. Should return an unscoped
pointer.
@trusted scope content(){return _content;}
}
@safe void main()
{ int* outer;
if(true)
{ int inner;
// Inferred as scope, which is intended
auto myVar = MyType(inner);
// Should be allowed
outer = myVar.content;
}
}
```
This pattern is perfectly @safe and makes sense. One problem
though - it does not compile. Auto-inference being on, the
compiler goes on to infer that `MyType.content` is `return scope`.
In this case, it would be easy to avoid this by simply disabling
auto-inference by giving the function an explicit type: `@trusted
pure nothrow @nogc scope int* content()`. This only works in
non-templated functions and types though. We sometimes need to
achieve the same inside a template too. We can do that:
```D
@trusted scope content()
{ auto tmp = _content;
return tmp;
}
```
This works. The compiler does not really track lifetimes of the
variables inside `@trusted` or `@system` functions. But it still
tries to be smart if directly returning a pointer from the struct.
Frankly, this violates the principle of least astonishment pretty
badly. Can't we just have a simple rule: if the function is
explicitly marked `@trusted` or `@system`, NO `scope` or `return`
attributes are inferred whatsoever?
More information about the Digitalmars-d
mailing list