digitalmars.D.bugs - [Issue 18002] New: assert subverts the type system with the messages
- d-bugmail puremagic.com (42/42) Nov 21 2017 https://issues.dlang.org/show_bug.cgi?id=18002
https://issues.dlang.org/show_bug.cgi?id=18002 Issue ID: 18002 Summary: assert subverts the type system with the messages that it accepts Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: issues.dlang jmdavisProg.com This code should not compile but does ===================== void main() { char[] message = "foo".dup; assert(0, message); } ===================== When assert fails, it gets converted to an AssertError, which - like all Throwables - takes a string for its message. So, the fact that assert accepts a char[] rather than a string means that either it's iduping what it's given or that it's implicitly converting char[] to immutable(char)[], which violates the type system. And as this D.Learn post demonstrates: http://forum.dlang.org/post/oiyngoqbjmmyscvlmpyj forum.dlang.org if you go and pass it a slice of a static array, it does _not_ copy the contents. It's clearly slicing them, which means that it is implicitly converting the char[] to immutable(char)[], thus violating the type system, and in the case where you pass it a slice of a static array, you're then dealing with an invalid pointer. I don't know why assert accepts anything other than string for its message (particularly given that AssertError requires a string, and the message needs to be on the stack), but either it needs to be fixed so that it requires string, and passing it a char[] is an error, or the implementation needs to idup the message. I'm inclined to think that restricting it to string and forcing the user to idup the char[] in the rare case that that's what's wanted would be the better option, but either way, it needs to be fixed so that assert doesn't subvert the type system. --
Nov 21 2017