diff --git a/src/libtest/lib.rs b/src/libtest/lib.rs index b11f783770f8..caaa4f7e2b7e 100644 --- a/src/libtest/lib.rs +++ b/src/libtest/lib.rs @@ -399,7 +399,9 @@ fn optgroups() -> getopts::Options { .optopt("", "format", "Configure formatting of output: pretty = Print verbose output; terse = Display one character per test; - json = Output a json document", "pretty|terse|json"); + json = Output a json document", "pretty|terse|json") + .optopt("Z", "", "Enable nightly-only flags: + unstable-options = Allow use of experimental features", "unstable-options"); return opts } @@ -435,8 +437,19 @@ Test Attributes: usage = options.usage(&message)); } +// FIXME: Copied from libsyntax until linkage errors are resolved. +fn is_nightly() -> bool { + // Whether this is a feature-staged build, i.e. on the beta or stable channel + let disable_unstable_features = option_env!("CFG_DISABLE_UNSTABLE_FEATURES").is_some(); + // Whether we should enable unstable features for bootstrapping + let bootstrap = env::var("RUSTC_BOOTSTRAP").is_ok(); + + bootstrap || !disable_unstable_features +} + // Parses command line arguments into test options pub fn parse_opts(args: &[String]) -> Option { + let mut allow_unstable = false; let opts = optgroups(); let args = args.get(1..).unwrap_or(args); let matches = match opts.parse(args) { @@ -444,6 +457,21 @@ pub fn parse_opts(args: &[String]) -> Option { Err(f) => return Some(Err(f.to_string())), }; + if let Some(opt) = matches.opt_str("Z") { + if !is_nightly() { + return Some(Err("the option `Z` is only accepted on the nightly compiler".into())); + } + + match &*opt { + "unstable-options" => { + allow_unstable = true; + } + _ => { + return Some(Err("Unrecognized option to `Z`".into())); + } + } + }; + if matches.opt_present("h") { usage(&args[0], &opts); return None; @@ -504,7 +532,13 @@ pub fn parse_opts(args: &[String]) -> Option { None if quiet => OutputFormat::Terse, Some("pretty") | None => OutputFormat::Pretty, Some("terse") => OutputFormat::Terse, - Some("json") => OutputFormat::Json, + Some("json") => { + if !allow_unstable { + return Some( + Err("The \"json\" format is only accepted on the nightly compiler".into())); + } + OutputFormat::Json + }, Some(v) => { return Some(Err(format!("argument for --format must be pretty, terse, or json (was \