Commit 45496a836abef115e4d5bccc89e738f4e3727cc1

Authored by Philip Top
Committed by Henry Schreiner
1 parent 478f582a

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.
Showing 1 changed file with 4 additions and 4 deletions
include/CLI/App.hpp
... ... @@ -1080,11 +1080,11 @@ class App {
1080 1080  
1081 1081 /// Add a subcommand. Inherits INHERITABLE and OptionDefaults, and help flag
1082 1082 App *add_subcommand(std::string subcommand_name, std::string description = "") {
1083   - subcommands_.emplace_back(new App(description, subcommand_name, this));
  1083 + CLI::App_p subcom(new App(description, subcommand_name, this));
1084 1084 for(const auto &subc : subcommands_)
1085   - if(subc.get() != subcommands_.back().get())
1086   - if(subc->check_name(subcommands_.back()->name_) || subcommands_.back()->check_name(subc->name_))
1087   - throw OptionAlreadyAdded(subc->name_);
  1085 + if(subc->check_name(subcommand_name) || subcom->check_name(subc->name_))
  1086 + throw OptionAlreadyAdded(subc->name_);
  1087 + subcommands_.push_back(std::move(subcom));
1088 1088 return subcommands_.back().get();
1089 1089 }
1090 1090  
... ...