digitalmars.D.bugs - [Issue 3926] New: opCast(bool) in classes is bug-prone
- d-bugmail puremagic.com (65/65) Mar 10 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3926
http://d.puremagic.com/issues/show_bug.cgi?id=3926 Summary: opCast(bool) in classes is bug-prone Product: D Version: 2.041 Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: bearophile_hugs eml.cc A opCast(bool) operator present in struct is called automatically in a if(x), but the same is not true if x is a class. So for example if you modify your code changing a struct into a class, other parts of the program will silently stop working (it usually return true if the class reference is not null). This is a problem, because it's bug-prone. This shows the situation: import std.stdio: writeln; struct FooStruct { int x; T opCast(T:bool)() { return this.x != 0; } } class FooClass { int x; this(int xx) { this.x = xx; } static FooClass opCall(int xx) { return new FooClass(xx); } T opCast(T:bool)() { return this.x != 0; } } void main() { enum int N = 0; auto fstruct = FooStruct(N); if (fstruct) writeln("fstruct true"); else writeln("fstruct false"); // fstruct false auto fclass = FooClass(N); if (fclass) writeln("fclass true"); // fclass true else writeln("fclass false"); if (cast(bool)fclass) writeln("fclass true"); else writeln("fclass false"); // fclass false } A possible simple solution is to selectively disallow opCast(bool) for classes. So an hypothetical conversion of a struct to a class raises a compile time error that helps avoid bugs. But this makes it impossible to have cast(bool) on classes. I don't know how often a cast(bool) can be useful in a class (probably not often). Another possible solution is to keep allowing cast(bool) in classes, but have if(fclass) call opCast(bool) for classes too, avoiding the asymmetry between structs and classes. But this requires to write if(fclass is null) to test the value of the object reference. This problem has to be faced soon, because later it will become impossible to fix. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Mar 10 2010