1
0
mirror of https://github.com/CLIUtils/CLI11.git synced 2025-05-01 21:23:52 +00:00

The add subcommand function was not exception safe. It added the subcommand to the vector before checking the already added option. This would result in duplicate subcommands being in place in the subcommands_ vector. The modifications make it exception safe and remove what I think was an unnecessary check for pointer duplication, that as far as I can tell was always false since it was comparing a newly created pointer directly to previously created ones.

This commit is contained in:
Philip Top 2019-01-25 07:06:07 -08:00 committed by Henry Schreiner
parent 478f582a71
commit 45496a836a

View File

@ -1080,11 +1080,11 @@ class App {
/// Add a subcommand. Inherits INHERITABLE and OptionDefaults, and help flag /// Add a subcommand. Inherits INHERITABLE and OptionDefaults, and help flag
App *add_subcommand(std::string subcommand_name, std::string description = "") { App *add_subcommand(std::string subcommand_name, std::string description = "") {
subcommands_.emplace_back(new App(description, subcommand_name, this)); CLI::App_p subcom(new App(description, subcommand_name, this));
for(const auto &subc : subcommands_) for(const auto &subc : subcommands_)
if(subc.get() != subcommands_.back().get()) if(subc->check_name(subcommand_name) || subcom->check_name(subc->name_))
if(subc->check_name(subcommands_.back()->name_) || subcommands_.back()->check_name(subc->name_)) throw OptionAlreadyAdded(subc->name_);
throw OptionAlreadyAdded(subc->name_); subcommands_.push_back(std::move(subcom));
return subcommands_.back().get(); return subcommands_.back().get();
} }