Commit 45496a836abef115e4d5bccc89e738f4e3727cc1
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 | ... | ... |