diff --git a/include/argparse/argparse.hpp b/include/argparse/argparse.hpp old mode 100755 new mode 100644 index 8d7dfbb..406edb0 --- a/include/argparse/argparse.hpp +++ b/include/argparse/argparse.hpp @@ -560,6 +560,16 @@ namespace argparse { if (arg_i < arguments_flat.size()) arg_entries[arg_i]->_convert(arguments_flat[arg_i]); } + + if (arg_i == arg_entries.size() && arg_i < arguments_flat.size()) { + if (raise_on_error) { + throw std::runtime_error("Too many positional values"); + } else { + std::cerr << "Too many positional values" << std::endl; + exit(-1); + } + } + size_t arg_j = 1; for (size_t j_end = arg_entries.size() - arg_i; arg_j <= j_end; arg_j++) { // iterate from back to front, to ensure non-multi-arguments in the front and back are given preference size_t flat_idx = arguments_flat.size() - arg_j; diff --git a/tests/tests.cpp b/tests/tests.cpp old mode 100755 new mode 100644 index a3c2071..ccaaac2 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -204,7 +204,7 @@ void TEST_THROW() { } { - std::string command = "argparse_test source_path source_path"; + std::string command = "argparse_test source_path"; const auto &[argc, argv] = get_argc_argv(command); try { auto args = argparse::parse(argc, argv, true); @@ -212,6 +212,17 @@ void TEST_THROW() { assert(std::string(e.what()) == "Argument missing: -a,--alpha (required alpha value)"); } } + + { + std::string command = "argparse_test source_path source_path"; + const auto &[argc, argv] = get_argc_argv(command); + try { + auto args = argparse::parse(argc, argv, true); + } catch (const std::runtime_error &e) { + assert(std::string(e.what()) == "Too many positional values"); + } + } + } void TEST_SUBCOMMANDS() { @@ -331,7 +342,7 @@ int main(int argc, char* argv[]) { std::cout << "Magic Enum not installed in this system, therefore native enum support disabled" << std::endl; #endif - TEST_SUBCOMMANDS(); + TEST_SUBCOMMANDS(); TEST_SHORT_GROUP(); TEST_EQUALS(); TEST_EMPTY_MULTI();