fix issue 23488 - std.format.sformat mishandles char ranges

This commit is contained in:
aG0aep6G 2022-11-15 21:10:14 +01:00
parent 6034c4f1ed
commit 26c7f44de8

View file

@ -1563,6 +1563,14 @@ char[] sformat(Char, Args...)(return scope char[] buf, scope const(Char)[] fmt,
{
char[] buf;
size_t i;
void put(char c)
{
if (buf.length <= i)
throw new RangeError(__FILE__, __LINE__);
buf[i] = c;
i += 1;
}
void put(dchar c)
{
char[4] enc;
@ -1687,6 +1695,19 @@ if (isSomeString!(typeof(fmt)))
assert(u == v);
}
@safe unittest // https://issues.dlang.org/show_bug.cgi?id=23488
{
static struct R
{
string s = "Ü";
bool empty() { return s.length == 0; }
char front() { return s[0]; }
void popFront() { s = s[1 .. $]; }
}
char[2] buf;
assert(sformat(buf, "%s", R()) == "Ü");
}
version (StdUnittest)
private void formatReflectTest(T)(ref T val, string fmt, string formatted, string fn = __FILE__, size_t ln = __LINE__)
{