Bug 8275 – DMD assumes that Object.toHash() overrides are @safe, even though base is @trusted
Status
RESOLVED
Resolution
INVALID
Severity
minor
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-06-20T19:37:00Z
Last change time
2012-06-20T21:02:37Z
Assigned to
nobody
Creator
alex
Comments
Comment #0 by alex — 2012-06-20T19:37:10Z
class A
{
override hash_t toHash() pure nothrow const
{
return *cast(hash_t*)&main;
}
}
void main()
{
}
test.d(5): Error: cast from void function() to uint* not allowed in safe code
Comment #1 by k.hara.pg — 2012-06-20T21:02:37Z
This is an expected behavior of attribute inference with inheritance.
class A {
void foo() @trusted {}
}
class B : A {
override void foo() {
int n;
//auto p = cast(int*)n; // not allowed in safe code
}
}
void main() {
pragma(msg, typeof(A.foo)); // prints "@trusted void()"
pragma(msg, typeof(B.foo)); // prints "@safe void()" !
}
When you inherit a @trusted method, the derived method that you write is inferred as @safe.
In other words, if you want to write @trusted code, you should qualify the method with @trueted attribute.
class B : A {
override void foo() @trusted {
int n;
auto p = cast(int*)n; // allowed in trusted code
}
}
It seems to me that is necessary to avoid accidentally breaking of @safe system.