Use error handler to report errors

This commit is contained in:
Victor Zverovich 2017-11-19 07:36:01 -08:00
parent 5a32e64b05
commit c523dd584f
4 changed files with 14 additions and 28 deletions

View File

@ -2018,18 +2018,18 @@ class context_base : public parse_context<Char>{
basic_args<Context> args() const { return args_; } basic_args<Context> args() const { return args_; }
// Returns the argument with specified index. // Returns the argument with specified index.
format_arg do_get_arg(unsigned arg_index, const char *&error) { format_arg do_get_arg(unsigned arg_index) {
format_arg arg = args_[arg_index]; format_arg arg = args_[arg_index];
if (!arg && !error) if (!arg)
error = "argument index out of range"; this->on_error("argument index out of range");
return arg; return arg;
} }
// Checks if manual indexing is used and returns the argument with // Checks if manual indexing is used and returns the argument with
// specified index. // specified index.
format_arg get_arg(unsigned arg_index, const char *&error) { format_arg get_arg(unsigned arg_index) {
return this->check_no_auto_index() ? return this->check_no_auto_index() ?
this->do_get_arg(arg_index, error) : format_arg(); this->do_get_arg(arg_index) : format_arg();
} }
public: public:
@ -2751,19 +2751,11 @@ class basic_context :
: Base(format_str, args) {} : Base(format_str, args) {}
format_arg next_arg() { format_arg next_arg() {
const char *error = 0; return this->do_get_arg(this->next_arg_index());
format_arg arg = this->do_get_arg(this->next_arg_index(), error);
if (error)
FMT_THROW(format_error(error));
return arg;
} }
format_arg get_arg(unsigned arg_index) { format_arg get_arg(unsigned arg_index) {
const char *error = 0; return this->do_get_arg(arg_index);
format_arg arg = this->do_get_arg(arg_index, error);
if (error)
FMT_THROW(format_error(error));
return arg;
} }
// Checks if manual indexing is used and returns the argument with // Checks if manual indexing is used and returns the argument with

View File

@ -367,18 +367,9 @@ template <typename Char, typename AF>
typename printf_context<Char, AF>::format_arg printf_context<Char, AF>::get_arg( typename printf_context<Char, AF>::format_arg printf_context<Char, AF>::get_arg(
iterator it, unsigned arg_index) { iterator it, unsigned arg_index) {
(void)it; (void)it;
const char *error = 0; if (arg_index == std::numeric_limits<unsigned>::max())
format_arg arg; return this->do_get_arg(this->next_arg_index());
if (arg_index == std::numeric_limits<unsigned>::max()) { return Base::get_arg(arg_index - 1);
arg_index = this->next_arg_index();
if (!error)
arg = this->do_get_arg(arg_index, error);
} else {
arg = Base::get_arg(arg_index - 1, error);
}
if (error)
FMT_THROW(format_error(!*it ? "invalid format string" : error));
return arg;
} }
template <typename Char, typename AF> template <typename Char, typename AF>

View File

@ -1906,4 +1906,7 @@ TEST(FormatTest, FormatStringErrors) {
EXPECT_ERROR("{1}{}", EXPECT_ERROR("{1}{}",
"cannot switch from manual to automatic argument indexing", "cannot switch from manual to automatic argument indexing",
int, int); int, int);
EXPECT_ERROR("{}{1}",
"cannot switch from automatic to manual argument indexing",
int, int);
} }

View File

@ -116,7 +116,7 @@ TEST(PrintfTest, InvalidArgIndex) {
format_error, "argument index out of range"); format_error, "argument index out of range");
EXPECT_THROW_MSG(fmt::sprintf("%2$", 42), EXPECT_THROW_MSG(fmt::sprintf("%2$", 42),
format_error, "invalid format string"); format_error, "argument index out of range");
EXPECT_THROW_MSG(fmt::sprintf(format("%{}$d", BIG_NUM), 42), EXPECT_THROW_MSG(fmt::sprintf(format("%{}$d", BIG_NUM), 42),
format_error, "number is too big"); format_error, "number is too big");
} }