diff --git a/include/fmt/format.h b/include/fmt/format.h index 0d672085..3d8fe70e 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -1975,41 +1975,42 @@ struct precision_adapter { template FMT_CONSTEXPR Iterator parse_format_specs(Iterator it, SpecHandler &&handler) { typedef typename std::iterator_traits::value_type char_type; + char_type c = *it; + if (c == '}' || !c) + return it; + // Parse fill and alignment. - if (char_type c = *it) { - alignment align = ALIGN_DEFAULT; - int i = 1; - do { - auto p = it + i; - switch (*p) { - case '<': - align = ALIGN_LEFT; - break; - case '>': - align = ALIGN_RIGHT; - break; - case '=': - align = ALIGN_NUMERIC; - break; - case '^': - align = ALIGN_CENTER; - break; - } - if (align != ALIGN_DEFAULT) { - handler.on_align(align); - if (p != it) { - if (c == '}') break; - if (c == '{') { - handler.on_error("invalid fill character '{'"); - return it; - } - it += 2; - handler.on_fill(c); - } else ++it; + alignment align = ALIGN_DEFAULT; + int i = 1; + do { + auto p = it + i; + switch (*p) { + case '<': + align = ALIGN_LEFT; break; - } - } while (--i >= 0); - } + case '>': + align = ALIGN_RIGHT; + break; + case '=': + align = ALIGN_NUMERIC; + break; + case '^': + align = ALIGN_CENTER; + break; + } + if (align != ALIGN_DEFAULT) { + if (p != it) { + if (c == '{') { + handler.on_error("invalid fill character '{'"); + return it; + } + it += 2; + handler.on_fill(c); + } else ++it; + handler.on_align(align); + break; + } + } while (--i >= 0); // Parse sign. switch (*it) { diff --git a/test/format-test.cc b/test/format-test.cc index 0044390e..a2e647bb 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -435,6 +435,7 @@ TEST(FormatterTest, Fill) { EXPECT_EQ("c****", format("{0:*<5}", 'c')); EXPECT_EQ("abc**", format("{0:*<5}", "abc")); EXPECT_EQ("**0xface", format("{0:*>8}", reinterpret_cast(0xface))); + EXPECT_EQ("foo=", format("{:}=", "foo")); } TEST(FormatterTest, PlusSign) {