diff --git a/src/parse/parser.rs b/src/parse/parser.rs index d759896396b..10e9b624b05 100644 --- a/src/parse/parser.rs +++ b/src/parse/parser.rs @@ -1195,12 +1195,9 @@ impl<'help, 'app> Parser<'help, 'app> { { debug!("Parser::parse_short_args: prior arg accepts hyphenated values",); return ParseResult::MaybeHyphenValue; - } else if self - .app - .args - .get(&pos_counter) - .map_or(false, |arg| arg.is_set(ArgSettings::AllowHyphenValues)) - { + } else if self.app.args.get(&pos_counter).map_or(false, |arg| { + arg.is_set(ArgSettings::AllowHyphenValues) && !arg.is_set(ArgSettings::Last) + }) { debug!( "Parser::parse_short_args: positional at {} allows hyphens", pos_counter diff --git a/tests/builder/positionals.rs b/tests/builder/positionals.rs index 6452aac2d44..e7f1a6d49db 100644 --- a/tests/builder/positionals.rs +++ b/tests/builder/positionals.rs @@ -287,3 +287,24 @@ fn positional_arg_with_short() { .arg(Arg::new("arg").index(1).short('a')) .try_get_matches(); } + +#[test] +fn ignore_hyphen_values_on_last() { + let app = clap::App::new("foo") + .arg( + clap::Arg::new("cmd") + .multiple_values(true) + .last(true) + .allow_hyphen_values(true), + ) + .arg( + clap::Arg::new("name") + .long("name") + .short('n') + .takes_value(true) + .required(false), + ); + + let matches = app.try_get_matches_from(["test", "-n", "foo"]).unwrap(); + assert_eq!(matches.value_of("name"), Some("foo")); +}