diff --git a/clap_builder/src/builder/debug_asserts.rs b/clap_builder/src/builder/debug_asserts.rs index 9e6154ab66a..001ef8a1201 100644 --- a/clap_builder/src/builder/debug_asserts.rs +++ b/clap_builder/src/builder/debug_asserts.rs @@ -139,12 +139,18 @@ pub(crate) fn assert_app(cmd: &Command) { } // requires, r_if, r_unless - for req in &arg.requires { + for (_predicate, req_id) in &arg.requires { assert!( - cmd.id_exists(&req.1), + &arg.id != req_id, + "Argument {} cannot require itself", + arg.get_id() + ); + + assert!( + cmd.id_exists(req_id), "Command {}: Argument or group '{}' specified in 'requires*' for '{}' does not exist", cmd.get_name(), - req.1, + req_id, arg.get_id(), ); } diff --git a/tests/builder/require.rs b/tests/builder/require.rs index ea0f09f57ef..14592ad0a9e 100644 --- a/tests/builder/require.rs +++ b/tests/builder/require.rs @@ -1478,3 +1478,11 @@ For more information, try '--help'. "; utils::assert_output(cmd, "test --require-first --second", EXPECTED, true); } + +#[test] +#[should_panic = "Argument flag cannot require itself"] +fn requires_self() { + let _result = Command::new("flag_required") + .arg(arg!(-f --flag "some flag").requires("flag")) + .try_get_matches_from(vec![""]); +}