Bug 5256 – null Rebindable testing not supported

Status
RESOLVED
Resolution
DUPLICATE
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2010-11-21T18:55:00Z
Last change time
2011-07-30T11:03:08Z
Keywords
rejects-valid
Assigned to
andrei
Creator
bearophile_hugs

Comments

Comment #0 by bearophile_hugs — 2010-11-21T18:55:50Z
This D2 program shows that you can't test if a class reference wrapped with Rebindable is null: import std.typecons; const class Foo {} void main() { auto a = Rebindable!Foo(new Foo); a = new Foo; assert(a !is null); // err } DMD 2.050 generates: test.d(6): Error: incompatible types for ((a) !is (null)): 'Rebindable!(const(Foo))' and 'void*' Is this the currently correct way to do it? (It works): assert(a.get() !is null); // OK I have seen the get() method is not documented on the site, so is that a temporary limitation caused by the unfinished "alis this" implementation? (Issue tagged with "Component: DMD" because I think it's a limit of "alias this").
Comment #1 by bearophile_hugs — 2011-07-30T11:03:08Z
assert(a !is null); is wrong code. Bug 4773 is now fixed. Now you are allowed to write: import std.stdio, std.typecons; const class Foo { invariant() { writeln("*"); } } void main() { auto a = Rebindable!Foo(new Foo); a = new Foo; //assert(a); // calls Foo.invariant() //assert(cast(bool)a); // doesn't call Foo.invariant(); auto f = new Foo(); assert(f); // calls Foo.invariant() assert(cast(bool)f); // doesn't call Foo.invariant(); } So I consider this bug too fixed. *** This issue has been marked as a duplicate of issue 4773 ***