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,11 +1080,11 @@ class App {
1080 1080
1081 /// Add a subcommand. Inherits INHERITABLE and OptionDefaults, and help flag 1081 /// Add a subcommand. Inherits INHERITABLE and OptionDefaults, and help flag
1082 App *add_subcommand(std::string subcommand_name, std::string description = "") { 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 for(const auto &subc : subcommands_) 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 return subcommands_.back().get(); 1088 return subcommands_.back().get();
1089 } 1089 }
1090 1090