[Issue 17567] New: make shared methods callable on unshared objects (and covariant)
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Wed Jun 28 06:40:42 PDT 2017
https://issues.dlang.org/show_bug.cgi?id=17567
Issue ID: 17567
Summary: make shared methods callable on unshared objects (and
covariant)
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: enhancement
Priority: P3
Component: dmd
Assignee: nobody at puremagic.com
Reporter: code at dawg.eu
cat > bug.d << CODE
struct S
{
void func() shared {}
}
void bug()
{
S s;
s.func;
}
dmd -c bug
----
bug.d(9): Error: shared method bug.S.func is not callable using a non-shared
object
----
cat > bug2.d << CODE
interface I
{
void func();
}
class C : I
{
void func() shared {}
}
CODE
dmd -c bug
----
bug.d(5): Error: class bug.C interface function 'void func()' is not
implemented
----
Both of these use-cases should be supported. Shared on a methods guarantees
thread-safety which is compatible with being used in an unshared manner.
Therefor shared methods should be fully covariant to unshared methods.
This does not touch shared as type qualifier, `shared(T)` means the type is
shared between threads, and hence is obviously not convertible to `T`.
Looks like this would be the first storage class where we'd support covariance
and real overloading.
While overloading, e.g. `nothrow` and non-`nothrow` methods is not an error,
the compiler always prefers `nothrow`, `pure`, `@safe`, or `@nogc` methods.
But overloading should prefer unshared methods over `shared` ones, e.g. because
the methods might avoid using a mutex.
--
More information about the Digitalmars-d-bugs
mailing list