diff --git a/src/builder/debug_asserts.rs b/src/builder/debug_asserts.rs index e40d9369e978..684e5a31d550 100644 --- a/src/builder/debug_asserts.rs +++ b/src/builder/debug_asserts.rs @@ -686,11 +686,6 @@ fn assert_arg(arg: &Arg) { "Argument '{}' cannot conflict with itself", arg.get_id(), ); - assert!( - !arg.overrides.iter().any(|x| *x == arg.id), - "Argument '{}' cannot override itself, its the default", - arg.get_id(), - ); assert_eq!( arg.get_action().takes_values(), diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 24550db27cc8..319d25c187e0 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -1180,7 +1180,9 @@ impl<'cmd> Parser<'cmd> { self.cur_idx.set(self.cur_idx.get() + 1); debug!("Parser::react: cur_idx:={}", self.cur_idx.get()); } - if matcher.remove(&arg.id) && !self.cmd.is_args_override_self() { + if matcher.remove(&arg.id) + && !(self.cmd.is_args_override_self() || arg.overrides.contains(arg.get_id())) + { return Err(ClapError::argument_conflict( self.cmd, arg.to_string(), @@ -1221,7 +1223,9 @@ impl<'cmd> Parser<'cmd> { raw_vals }; - if matcher.remove(&arg.id) && !self.cmd.is_args_override_self() { + if matcher.remove(&arg.id) + && !(self.cmd.is_args_override_self() || arg.overrides.contains(arg.get_id())) + { return Err(ClapError::argument_conflict( self.cmd, arg.to_string(), @@ -1240,7 +1244,9 @@ impl<'cmd> Parser<'cmd> { raw_vals }; - if matcher.remove(&arg.id) && !self.cmd.is_args_override_self() { + if matcher.remove(&arg.id) + && !(self.cmd.is_args_override_self() || arg.overrides.contains(arg.get_id())) + { return Err(ClapError::argument_conflict( self.cmd, arg.to_string(),