cast(bool)array must be rewritten to cast(bool)array.length. assert(!""); // currently fails assert(![]); // currently passes assert(![' '][1..1]); // passes assert(!" "[1..1]); // fails assert(a==b && (!a&&b||!b&&a)); // might fail more or less randomly for dynamic arrays a,b The current behavior is that cast(bool)array is translated to cast(bool)array.ptr. This is likely a leftover from the times when dynamic arrays implicitly converted to their .ptr properties. It does not convey any useful semantics, yet it is invoked implicitly every time a dynamic array appears in a boolean evaluation context. struct DynArray{ size_t length; int* ptr; alias ptr this; } void main(){ DynArray a; int[] b; writeln(cast(bool)a); // false writeln(cast(bool)b); // false a.ptr = new int; writeln(cast(bool)a); // true *(cast(int**)&b+1) = new int; // "b.ptr = new int" writeln(cast(bool)b); // true }
More evidence: Currently these both fail to interpret with the same error message. static assert(cast(int*)[]||1); static assert(cast(bool)[]||1); The current semantics were an accident.
See also issue 4733
*** This issue has been marked as a duplicate of issue 4733 ***
:(