File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -1897,7 +1897,7 @@ namespace argparse
18971897 m_options.mutually_exclusive_group = group;
18981898 }
18991899
1900- ~ArgumentBuilder ()
1900+ ~ArgumentBuilder () noexcept ( false )
19011901 {
19021902 if ((m_options.action == argparse::version) && m_options.help .empty ())
19031903 {
@@ -1906,6 +1906,15 @@ namespace argparse
19061906
19071907 if (is_positional ())
19081908 {
1909+ if (m_options.mutually_exclusive_group != nullptr
1910+ && (!m_options.nargs .has_value ()
1911+ || (!std::holds_alternative<Nargs>(*m_options.nargs )
1912+ || (std::get<Nargs>(*m_options.nargs ) != zero_or_one
1913+ && std::get<Nargs>(*m_options.nargs ) != zero_or_more))))
1914+ {
1915+ throw option_error (" mutually exclusive arguments must be optional" );
1916+ }
1917+
19091918 m_arguments.emplace_back (PositionalArgument (std::move (m_options)));
19101919 }
19111920 else
Original file line number Diff line number Diff line change @@ -350,6 +350,23 @@ TEST_CASE("ArgumentParser supports mutually exclusive groups")
350350 CHECK_NOTHROW (parser.add_mutually_exclusive_group ());
351351}
352352
353+ TEST_CASE (" Adding a positional argument to a mutually exclusive group results in error" )
354+ {
355+ auto parser = argparse::ArgumentParser ();
356+ auto group = parser.add_mutually_exclusive_group ();
357+
358+ CHECK_THROWS_WITH_AS (group.add_argument (" pos" ), " mutually exclusive arguments must be optional" , argparse::option_error);
359+ }
360+
361+ TEST_CASE (" Adding a non-required positional argument to a mutually exclusive group does not result in error" )
362+ {
363+ auto parser = argparse::ArgumentParser ();
364+ auto group = parser.add_mutually_exclusive_group ();
365+
366+ CHECK_NOTHROW (group.add_argument (" pos" ).nargs (argparse::zero_or_one));
367+ CHECK_NOTHROW (group.add_argument (" pos" ).nargs (argparse::zero_or_more));
368+ }
369+
353370TEST_CASE (" Adding an optional argument to a mutually exclusive group does not result in error" )
354371{
355372 auto parser = argparse::ArgumentParser ();
You can’t perform that action at this time.
0 commit comments