www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 18002] New: assert subverts the type system with the messages


          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