Skip to content

Commit 806883d

Browse files
authored
Merge pull request #982 from cppalliance/981
2 parents 6cd9687 + 748dabf commit 806883d

File tree

4 files changed

+42
-37
lines changed

4 files changed

+42
-37
lines changed

include/boost/decimal/fmt_format.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,14 @@ constexpr auto parse_impl(ParseContext &ctx)
9999
BOOST_DECIMAL_THROW_EXCEPTION(std::logic_error("Invalid format specifier"));
100100
// LCOV_EXCL_STOP
101101
}
102+
++it;
102103
}
103104

104-
++it;
105+
// Verify we're at the closing brace
106+
if (it != ctx.end() && *it != '}')
107+
{
108+
BOOST_DECIMAL_THROW_EXCEPTION(std::logic_error("Expected '}' in format string")); // LCOV_EXCL_LINE
109+
}
105110

106111
return std::make_tuple(ctx_precision, fmt, is_upper, padding_digits, it);
107112
}

include/boost/decimal/format.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,14 @@ constexpr auto parse_impl(ParseContext &ctx)
9595
BOOST_DECIMAL_THROW_EXCEPTION(std::format_error("Invalid format specifier"));
9696
// LCOV_EXCL_STOP
9797
}
98+
++it;
9899
}
99100

100-
++it;
101+
// Verify we're at the closing brace
102+
if (it != ctx.end() && *it != '}')
103+
{
104+
BOOST_DECIMAL_THROW_EXCEPTION(std::format_error("Expected '}' in format string")); // LCOV_EXCL_LINE
105+
}
101106

102107
return std::make_tuple(ctx_precision, fmt, is_upper, padding_digits, it);
103108
}

test/test_format.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@ using namespace boost::decimal;
1313
template <typename T>
1414
void test_general()
1515
{
16-
// For unknown reasons Clang does not like this empty bracket and throws compiler errors
17-
#ifndef __clang__
18-
1916
BOOST_TEST_EQ(std::format("{}", T{1}), "1");
2017
BOOST_TEST_EQ(std::format("{}", T{10}), "10");
2118
BOOST_TEST_EQ(std::format("{}", T{100}), "100");
@@ -44,8 +41,6 @@ void test_general()
4441
BOOST_TEST_EQ(std::format("{}", std::numeric_limits<T>::signaling_NaN()), "nan(snan)");
4542
BOOST_TEST_EQ(std::format("{}", -std::numeric_limits<T>::signaling_NaN()), "-nan(snan)");
4643

47-
#endif // defined(__clang__)
48-
4944
BOOST_TEST_EQ(std::format("{:g}", T{1}), "1");
5045
BOOST_TEST_EQ(std::format("{:g}", T{10}), "10");
5146
BOOST_TEST_EQ(std::format("{:g}", T{100}), "100");

test/test_format_fmtlib.cpp

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,15 @@ void test_general()
3131

3232
BOOST_DECIMAL_IF_CONSTEXPR (std::numeric_limits<T>::digits10 <= 7)
3333
{
34-
BOOST_TEST_EQ(fmt::format("{}", T {21, 6}), "2.1e+07");
35-
BOOST_TEST_EQ(fmt::format("{}", T {211, 6}), "2.11e+08");
36-
BOOST_TEST_EQ(fmt::format("{}", T {2111, 6}), "2.111e+09");
34+
BOOST_TEST_EQ(fmt::format("{}", T {21u, 6}), "2.1e+07");
35+
BOOST_TEST_EQ(fmt::format("{}", T {211u, 6}), "2.11e+08");
36+
BOOST_TEST_EQ(fmt::format("{}", T {2111u, 6}), "2.111e+09");
3737
}
3838
else
3939
{
40-
BOOST_TEST_EQ(fmt::format("{}", T {21, 6}), "21000000");
41-
BOOST_TEST_EQ(fmt::format("{}", T {211, 6}), "211000000");
42-
BOOST_TEST_EQ(fmt::format("{}", T {2111, 6}), "2111000000");
40+
BOOST_TEST_EQ(fmt::format("{}", T {21u, 6}), "21000000");
41+
BOOST_TEST_EQ(fmt::format("{}", T {211u, 6}), "211000000");
42+
BOOST_TEST_EQ(fmt::format("{}", T {2111u, 6}), "2111000000");
4343
}
4444

4545
BOOST_TEST_EQ(fmt::format("{}", std::numeric_limits<T>::infinity()), "inf");
@@ -59,18 +59,18 @@ void test_general()
5959

6060
BOOST_DECIMAL_IF_CONSTEXPR (std::numeric_limits<T>::digits10 <= 7)
6161
{
62-
BOOST_TEST_EQ(fmt::format("{:g}", T {21, 6, true}), "-2.1e+07");
63-
BOOST_TEST_EQ(fmt::format("{:g}", T {211, 6, true}), "-2.11e+08");
64-
BOOST_TEST_EQ(fmt::format("{:g}", T {2111, 6, true}), "-2.111e+09");
65-
BOOST_TEST_EQ(fmt::format("{:G}", T {21, 6, true}), "-2.1E+07");
66-
BOOST_TEST_EQ(fmt::format("{:G}", T {211, 6, true}), "-2.11E+08");
67-
BOOST_TEST_EQ(fmt::format("{:G}", T {2111, 6, true}), "-2.111E+09");
62+
BOOST_TEST_EQ(fmt::format("{:g}", T {21u, 6, true}), "-2.1e+07");
63+
BOOST_TEST_EQ(fmt::format("{:g}", T {211u, 6, true}), "-2.11e+08");
64+
BOOST_TEST_EQ(fmt::format("{:g}", T {2111u, 6, true}), "-2.111e+09");
65+
BOOST_TEST_EQ(fmt::format("{:G}", T {21u, 6, true}), "-2.1E+07");
66+
BOOST_TEST_EQ(fmt::format("{:G}", T {211u, 6, true}), "-2.11E+08");
67+
BOOST_TEST_EQ(fmt::format("{:G}", T {2111u, 6, true}), "-2.111E+09");
6868
}
6969
else
7070
{
71-
BOOST_TEST_EQ(fmt::format("{:g}", T {21, 6, true}), "-21000000");
72-
BOOST_TEST_EQ(fmt::format("{:g}", T {211, 6, true}), "-211000000");
73-
BOOST_TEST_EQ(fmt::format("{:g}", T {2111, 6, true}), "-2111000000");
71+
BOOST_TEST_EQ(fmt::format("{:g}", T {21u, 6, true}), "-21000000");
72+
BOOST_TEST_EQ(fmt::format("{:g}", T {211u, 6, true}), "-211000000");
73+
BOOST_TEST_EQ(fmt::format("{:g}", T {2111u, 6, true}), "-2111000000");
7474
}
7575

7676
BOOST_TEST_EQ(fmt::format("{:g}", std::numeric_limits<T>::infinity()), "inf");
@@ -91,17 +91,17 @@ void test_general()
9191
template <typename T>
9292
void test_fixed()
9393
{
94-
BOOST_TEST_EQ(fmt::format("{:f}", T {21, 6, true}), "-21000000.000000");
95-
BOOST_TEST_EQ(fmt::format("{:f}", T {211, 6, true}), "-211000000.000000");
96-
BOOST_TEST_EQ(fmt::format("{:f}", T {2111, 6, true}), "-2111000000.000000");
94+
BOOST_TEST_EQ(fmt::format("{:f}", T {21u, 6, true}), "-21000000.000000");
95+
BOOST_TEST_EQ(fmt::format("{:f}", T {211u, 6, true}), "-211000000.000000");
96+
BOOST_TEST_EQ(fmt::format("{:f}", T {2111u, 6, true}), "-2111000000.000000");
9797

98-
BOOST_TEST_EQ(fmt::format("{:.0f}", T {21, 6, true}), std::string{"-21000000"});
99-
BOOST_TEST_EQ(fmt::format("{:.0f}", T {211, 6, true}), std::string{"-211000000"});
100-
BOOST_TEST_EQ(fmt::format("{:.0f}", T {2111, 6, true}), std::string{"-2111000000"});
98+
BOOST_TEST_EQ(fmt::format("{:.0f}", T {21u, 6, true}), std::string{"-21000000"});
99+
BOOST_TEST_EQ(fmt::format("{:.0f}", T {211u, 6, true}), std::string{"-211000000"});
100+
BOOST_TEST_EQ(fmt::format("{:.0f}", T {2111u, 6, true}), std::string{"-2111000000"});
101101

102-
BOOST_TEST_EQ(fmt::format("{:.1f}", T {21, 6, true}), std::string{"-21000000.0"});
103-
BOOST_TEST_EQ(fmt::format("{:.1f}", T {211, 6, true}), std::string{"-211000000.0"});
104-
BOOST_TEST_EQ(fmt::format("{:.1f}", T {2111, 6, true}), std::string{"-2111000000.0"});
102+
BOOST_TEST_EQ(fmt::format("{:.1f}", T {21u, 6, true}), std::string{"-21000000.0"});
103+
BOOST_TEST_EQ(fmt::format("{:.1f}", T {211u, 6, true}), std::string{"-211000000.0"});
104+
BOOST_TEST_EQ(fmt::format("{:.1f}", T {2111u, 6, true}), std::string{"-2111000000.0"});
105105

106106
BOOST_TEST_EQ(fmt::format("{:.0f}", T {0}), "0");
107107
BOOST_TEST_EQ(fmt::format("{:f}", std::numeric_limits<T>::infinity()), "inf");
@@ -122,13 +122,13 @@ void test_fixed()
122122
template <typename T>
123123
void test_scientific()
124124
{
125-
BOOST_TEST_EQ(fmt::format("{:e}", T {21, 6, true}), "-2.100000e+07");
126-
BOOST_TEST_EQ(fmt::format("{:e}", T {211, 6, true}), "-2.110000e+08");
127-
BOOST_TEST_EQ(fmt::format("{:e}", T {2111, 6, true}), "-2.111000e+09");
125+
BOOST_TEST_EQ(fmt::format("{:e}", T {21u, 6, true}), "-2.100000e+07");
126+
BOOST_TEST_EQ(fmt::format("{:e}", T {211u, 6, true}), "-2.110000e+08");
127+
BOOST_TEST_EQ(fmt::format("{:e}", T {2111u, 6, true}), "-2.111000e+09");
128128

129-
BOOST_TEST_EQ(fmt::format("{:E}", T {21, 6, true}), "-2.100000E+07");
130-
BOOST_TEST_EQ(fmt::format("{:E}", T {211, 6, true}), "-2.110000E+08");
131-
BOOST_TEST_EQ(fmt::format("{:E}", T {2111, 6, true}), "-2.111000E+09");
129+
BOOST_TEST_EQ(fmt::format("{:E}", T {21u, 6, true}), "-2.100000E+07");
130+
BOOST_TEST_EQ(fmt::format("{:E}", T {211u, 6, true}), "-2.110000E+08");
131+
BOOST_TEST_EQ(fmt::format("{:E}", T {2111u, 6, true}), "-2.111000E+09");
132132

133133
BOOST_TEST_EQ(fmt::format("{:.0E}", T {0}), "0E+00");
134134
BOOST_TEST_EQ(fmt::format("{:e}", std::numeric_limits<T>::infinity()), "inf");

0 commit comments

Comments
 (0)