From 45496a836abef115e4d5bccc89e738f4e3727cc1 Mon Sep 17 00:00:00 2001 From: Philip Top Date: Fri, 25 Jan 2019 07:06:07 -0800 Subject: [PATCH] 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. --- include/CLI/App.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/CLI/App.hpp b/include/CLI/App.hpp index 664e6f068..eb8f45a39 100644 --- a/include/CLI/App.hpp +++ b/include/CLI/App.hpp @@ -1080,11 +1080,11 @@ class App { /// Add a subcommand. Inherits INHERITABLE and OptionDefaults, and help flag 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_) - if(subc.get() != subcommands_.back().get()) - if(subc->check_name(subcommands_.back()->name_) || subcommands_.back()->check_name(subc->name_)) - throw OptionAlreadyAdded(subc->name_); + if(subc->check_name(subcommand_name) || subcom->check_name(subc->name_)) + throw OptionAlreadyAdded(subc->name_); + subcommands_.push_back(std::move(subcom)); return subcommands_.back().get(); }