diff --git a/src/core/internal/dassert.d b/src/core/internal/dassert.d index afb9136a6bb..4aa1371cfc6 100644 --- a/src/core/internal/dassert.d +++ b/src/core/internal/dassert.d @@ -95,10 +95,33 @@ private string miniFormat(V)(const scope ref V v) } else static if (__traits(isIntegral, V)) { - enum printfFormat = getPrintfFormat!V; - char[20] val; - const len = sprintf(&val[0], printfFormat, v); - return val.idup[0 .. len]; + static if (is(V == char)) + { + // Avoid invalid code points + if (v < 0x7F) + return ['\'', v, '\'']; + + uint tmp = v; + return "cast(char) " ~ miniFormat(tmp); + } + else static if (is(V == wchar) || is(V == dchar)) + { + import core.internal.utf: isValidDchar, toUTF8; + + // Avoid invalid code points + if (isValidDchar(v)) + return toUTF8(['\'', v, '\'']); + + uint tmp = v; + return "cast(" ~ V.stringof ~ ") " ~ miniFormat(tmp); + } + else + { + enum printfFormat = getPrintfFormat!V; + char[20] val; + const len = sprintf(&val[0], printfFormat, v); + return val.idup[0 .. len]; + } } else static if (__traits(isFloating, V)) { diff --git a/test/exceptions/src/assert_fail.d b/test/exceptions/src/assert_fail.d index d7de373b5b4..c4983e51de2 100644 --- a/test/exceptions/src/assert_fail.d +++ b/test/exceptions/src/assert_fail.d @@ -63,6 +63,15 @@ void testStrings() // https://issues.dlang.org/show_bug.cgi?id=20322 test("left"w, "right"w, `"left" != "right"`); test("left"d, "right"d, `"left" != "right"`); + + test('A', 'B', "'A' != 'B'"); + test(wchar('❤'), wchar('∑'), "'❤' != '∑'"); + test(dchar('❤'), dchar('∑'), "'❤' != '∑'"); + + // Detect invalid code points + test(char(255), 'B', "cast(char) 255 != 'B'"); + test(wchar(0xD888), wchar('∑'), "cast(wchar) 55432 != '∑'"); + test(dchar(0xDDDD), dchar('∑'), "cast(dchar) 56797 != '∑'"); } void testToString()()