diff --git a/src/parse/validator.rs b/src/parse/validator.rs index 14b86d3c80e..09b9109480a 100644 --- a/src/parse/validator.rs +++ b/src/parse/validator.rs @@ -681,8 +681,11 @@ impl<'help, 'app, 'parser> Validator<'help, 'app, 'parser> { let used: Vec = matcher .arg_names() .filter(|n| { + // Filter out the args we don't want to specify. self.p.app.find(n).map_or(true, |a| { - !(a.is_set(ArgSettings::Hidden) || self.p.required.contains(&a.id)) + !a.is_set(ArgSettings::Hidden) + && a.default_vals.is_empty() + && !self.p.required.contains(&a.id) }) }) .cloned() diff --git a/tests/default_vals.rs b/tests/default_vals.rs index 5c310a2560a..aaa9c03fe57 100644 --- a/tests/default_vals.rs +++ b/tests/default_vals.rs @@ -1,3 +1,4 @@ +mod utils; use clap::{App, Arg, ErrorKind}; #[test] @@ -588,6 +589,30 @@ fn multiple_defaults_override() { assert_eq!(m.values_of_lossy("files").unwrap(), vec!["other", "mine"]); } +#[test] +fn default_vals_donnot_show_in_smart_usage() { + let app = App::new("bug") + .arg( + Arg::new("foo") + .long("config") + .takes_value(true) + .default_value("bar"), + ) + .arg(Arg::new("input").required(true)); + assert!(utils::compare_output( + app, + "bug", + "error: The following required arguments were not provided: + + +USAGE: + bug [OPTIONS] + +For more information try --help", + true, + )); +} + #[test] fn issue_1050_num_vals_and_defaults() { let res = App::new("hello")