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.