From b3abddf75141448d1d5d3c15f1cb08a5855fb7c6 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Wed, 3 Dec 2025 19:38:07 +0100 Subject: [PATCH 1/2] Disallow required optional arguments in mutually exclusive groups --- include/argparse.hpp | 6 ++++++ test/unittest/test_argument_parser.cpp | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/include/argparse.hpp b/include/argparse.hpp index 4ac2468..44d4259 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1919,6 +1919,12 @@ namespace argparse } else { + if (m_options.mutually_exclusive_group != nullptr + && m_options.required) + { + throw 1; + } + m_arguments.emplace_back(OptionalArgument(std::move(m_options))); } } diff --git a/test/unittest/test_argument_parser.cpp b/test/unittest/test_argument_parser.cpp index e8a9062..a25cb36 100644 --- a/test/unittest/test_argument_parser.cpp +++ b/test/unittest/test_argument_parser.cpp @@ -375,6 +375,14 @@ TEST_CASE("Adding an optional argument to a mutually exclusive group does not re CHECK_NOTHROW(group.add_argument("-o")); } +TEST_CASE("Adding a required optional argument to a mutually exclusive group results in error") +{ + auto parser = argparse::ArgumentParser(); + auto group = parser.add_mutually_exclusive_group(); + + CHECK_THROWS(group.add_argument("-o").required(true)); +} + TEST_CASE("Test combining Handle values") { CHECK((argparse::Handle::none | argparse::Handle::errors) == argparse::Handle::errors); From 9c8a9107c8b2cedfcfdfbc1fdcff9a14efb2b9d0 Mon Sep 17 00:00:00 2001 From: Krzysiek Karbowiak Date: Wed, 3 Dec 2025 19:41:30 +0100 Subject: [PATCH 2/2] Improve error message --- include/argparse.hpp | 2 +- test/unittest/test_argument_parser.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/argparse.hpp b/include/argparse.hpp index 44d4259..faf1d74 100644 --- a/include/argparse.hpp +++ b/include/argparse.hpp @@ -1922,7 +1922,7 @@ namespace argparse if (m_options.mutually_exclusive_group != nullptr && m_options.required) { - throw 1; + throw option_error("mutually exclusive arguments must be optional"); } m_arguments.emplace_back(OptionalArgument(std::move(m_options))); diff --git a/test/unittest/test_argument_parser.cpp b/test/unittest/test_argument_parser.cpp index a25cb36..edce5c4 100644 --- a/test/unittest/test_argument_parser.cpp +++ b/test/unittest/test_argument_parser.cpp @@ -380,7 +380,7 @@ TEST_CASE("Adding a required optional argument to a mutually exclusive group res auto parser = argparse::ArgumentParser(); auto group = parser.add_mutually_exclusive_group(); - CHECK_THROWS(group.add_argument("-o").required(true)); + CHECK_THROWS_WITH_AS(group.add_argument("-o").required(true), "mutually exclusive arguments must be optional", argparse::option_error); } TEST_CASE("Test combining Handle values")