From b0dba7439d4bc35df6185388d4e9af1b6cd5f1e9 Mon Sep 17 00:00:00 2001 From: Tim Neumann Date: Sat, 24 Sep 2016 18:42:54 +0200 Subject: [PATCH 1/8] make emit_feature_err take a ParseSess --- src/librustc/middle/stability.rs | 4 ++-- src/librustc_passes/static_recursion.rs | 2 +- src/librustc_typeck/astconv.rs | 4 ++-- src/librustc_typeck/check/mod.rs | 2 +- src/libsyntax/config.rs | 2 +- src/libsyntax/ext/expand.rs | 2 +- src/libsyntax/feature_gate.rs | 24 +++++++++++++----------- src/libsyntax_ext/asm.rs | 2 +- src/libsyntax_ext/concat_idents.rs | 2 +- src/libsyntax_ext/deriving/mod.rs | 2 +- src/libsyntax_ext/log_syntax.rs | 2 +- src/libsyntax_ext/trace_macros.rs | 2 +- 12 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs index 2c768db47f11a..ccab4279232b5 100644 --- a/src/librustc/middle/stability.rs +++ b/src/librustc/middle/stability.rs @@ -411,8 +411,8 @@ impl<'a, 'tcx> Checker<'a, 'tcx> { &feature, &r), None => format!("use of unstable library feature '{}'", &feature) }; - emit_feature_err(&self.tcx.sess.parse_sess.span_diagnostic, - &feature, span, GateIssue::Library(Some(issue)), &msg); + emit_feature_err(&self.tcx.sess.parse_sess, &feature, span, + GateIssue::Library(Some(issue)), &msg); } } Some(&Stability { ref level, ref feature, .. }) => { diff --git a/src/librustc_passes/static_recursion.rs b/src/librustc_passes/static_recursion.rs index 0ab8e2d7fcd28..0336c3063d83f 100644 --- a/src/librustc_passes/static_recursion.rs +++ b/src/librustc_passes/static_recursion.rs @@ -143,7 +143,7 @@ impl<'a, 'ast: 'a> CheckItemRecursionVisitor<'a, 'ast> { }); if any_static { if !self.sess.features.borrow().static_recursion { - emit_feature_err(&self.sess.parse_sess.span_diagnostic, + emit_feature_err(&self.sess.parse_sess, "static_recursion", *self.root_span, GateIssue::Language, diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs index cbdce3229c7c7..f5e289c33028e 100644 --- a/src/librustc_typeck/astconv.rs +++ b/src/librustc_typeck/astconv.rs @@ -795,7 +795,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o { // For now, require that parenthetical notation be used // only with `Fn()` etc. if !self.tcx().sess.features.borrow().unboxed_closures && trait_def.paren_sugar { - emit_feature_err(&self.tcx().sess.parse_sess.span_diagnostic, + emit_feature_err(&self.tcx().sess.parse_sess, "unboxed_closures", span, GateIssue::Language, "\ the precise format of `Fn`-family traits' \ @@ -807,7 +807,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o { // For now, require that parenthetical notation be used // only with `Fn()` etc. if !self.tcx().sess.features.borrow().unboxed_closures && !trait_def.paren_sugar { - emit_feature_err(&self.tcx().sess.parse_sess.span_diagnostic, + emit_feature_err(&self.tcx().sess.parse_sess, "unboxed_closures", span, GateIssue::Language, "\ parenthetical notation is only stable when used with `Fn`-family traits"); diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index e406807b51c31..47f545a672695 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -3256,7 +3256,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { if let Some((def_id, variant)) = variant { if variant.kind == ty::VariantKind::Tuple && !self.tcx.sess.features.borrow().relaxed_adts { - emit_feature_err(&self.tcx.sess.parse_sess.span_diagnostic, + emit_feature_err(&self.tcx.sess.parse_sess, "relaxed_adts", span, GateIssue::Language, "tuple structs and variants in struct patterns are unstable"); } diff --git a/src/libsyntax/config.rs b/src/libsyntax/config.rs index abbbbe1e3d1cc..78d047c7651f9 100644 --- a/src/libsyntax/config.rs +++ b/src/libsyntax/config.rs @@ -157,7 +157,7 @@ impl<'a> StripUnconfigured<'a> { // flag the offending attributes for attr in attrs.iter() { if !self.features.map(|features| features.stmt_expr_attributes).unwrap_or(true) { - emit_feature_err(&self.sess.span_diagnostic, + emit_feature_err(&self.sess, "stmt_expr_attributes", attr.span, GateIssue::Language, diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 7359c21ecccac..43c622189632a 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -344,7 +344,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { // Detect use of feature-gated or invalid attributes on macro invoations // since they will not be detected after macro expansion. for attr in attrs.iter() { - feature_gate::check_attribute(&attr, &self.cx.parse_sess.span_diagnostic, + feature_gate::check_attribute(&attr, &self.cx.parse_sess, &self.cx.parse_sess.codemap(), &self.cx.ecfg.features.unwrap()); } diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 75cfa587ab1f3..f8eb4508b1606 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -679,16 +679,15 @@ impl GatedCfg { pub fn check_and_emit(&self, sess: &ParseSess, features: &Features) { let (cfg, feature, has_feature) = GATED_CFGS[self.index]; if !has_feature(features) && !sess.codemap().span_allows_unstable(self.span) { - let diagnostic = &sess.span_diagnostic; let explain = format!("`cfg({})` is experimental and subject to change", cfg); - emit_feature_err(diagnostic, feature, self.span, GateIssue::Language, &explain); + emit_feature_err(sess, feature, self.span, GateIssue::Language, &explain); } } } struct Context<'a> { features: &'a Features, - span_handler: &'a Handler, + parse_sess: &'a ParseSess, cm: &'a CodeMap, plugin_attributes: &'a [(String, AttributeType)], } @@ -699,7 +698,7 @@ macro_rules! gate_feature_fn { let has_feature: bool = has_feature(&$cx.features); debug!("gate_feature(feature = {:?}, span = {:?}); has? {}", name, span, has_feature); if !has_feature && !cx.cm.span_allows_unstable(span) { - emit_feature_err(cx.span_handler, name, span, GateIssue::Language, explain); + emit_feature_err(cx.parse_sess, name, span, GateIssue::Language, explain); } }} } @@ -756,10 +755,10 @@ impl<'a> Context<'a> { } } -pub fn check_attribute(attr: &ast::Attribute, handler: &Handler, +pub fn check_attribute(attr: &ast::Attribute, parse_sess: &ParseSess, cm: &CodeMap, features: &Features) { let cx = Context { - features: features, span_handler: handler, + features: features, parse_sess: parse_sess, cm: cm, plugin_attributes: &[] }; cx.check_attribute(attr, true); @@ -788,8 +787,10 @@ pub enum GateIssue { Library(Option) } -pub fn emit_feature_err(diag: &Handler, feature: &str, span: Span, issue: GateIssue, +pub fn emit_feature_err(sess: &ParseSess, feature: &str, span: Span, issue: GateIssue, explain: &str) { + let diag = &sess.span_diagnostic; + let issue = match issue { GateIssue::Language => find_lang_feature_issue(feature), GateIssue::Library(lib) => lib, @@ -962,9 +963,10 @@ impl<'a> Visitor for PostExpansionVisitor<'a> { if attr::contains_name(&i.attrs[..], "simd") { gate_feature_post!(&self, simd, i.span, "SIMD types are experimental and possibly buggy"); - self.context.span_handler.span_warn(i.span, - "the `#[simd]` attribute is deprecated, \ - use `#[repr(simd)]` instead"); + self.context.parse_sess.span_diagnostic.span_warn(i.span, + "the `#[simd]` attribute \ + is deprecated, use \ + `#[repr(simd)]` instead"); } for attr in &i.attrs { if attr.name() == "repr" { @@ -1273,7 +1275,7 @@ pub fn check_crate(krate: &ast::Crate, maybe_stage_features(&sess.span_diagnostic, krate, unstable); let ctx = Context { features: features, - span_handler: &sess.span_diagnostic, + parse_sess: sess, cm: sess.codemap(), plugin_attributes: plugin_attributes, }; diff --git a/src/libsyntax_ext/asm.rs b/src/libsyntax_ext/asm.rs index 77425b809de1d..cc4fb604d6ccb 100644 --- a/src/libsyntax_ext/asm.rs +++ b/src/libsyntax_ext/asm.rs @@ -53,7 +53,7 @@ pub fn expand_asm<'cx>(cx: &'cx mut ExtCtxt, tts: &[tokenstream::TokenTree]) -> Box { if !cx.ecfg.enable_asm() { - feature_gate::emit_feature_err(&cx.parse_sess.span_diagnostic, + feature_gate::emit_feature_err(&cx.parse_sess, "asm", sp, feature_gate::GateIssue::Language, diff --git a/src/libsyntax_ext/concat_idents.rs b/src/libsyntax_ext/concat_idents.rs index 15aaf3c78237f..e56c6e2229a75 100644 --- a/src/libsyntax_ext/concat_idents.rs +++ b/src/libsyntax_ext/concat_idents.rs @@ -23,7 +23,7 @@ pub fn expand_syntax_ext<'cx>(cx: &'cx mut ExtCtxt, tts: &[TokenTree]) -> Box { if !cx.ecfg.enable_concat_idents() { - feature_gate::emit_feature_err(&cx.parse_sess.span_diagnostic, + feature_gate::emit_feature_err(&cx.parse_sess, "concat_idents", sp, feature_gate::GateIssue::Language, diff --git a/src/libsyntax_ext/deriving/mod.rs b/src/libsyntax_ext/deriving/mod.rs index c3c2f7eabb9c7..e3a38d568d313 100644 --- a/src/libsyntax_ext/deriving/mod.rs +++ b/src/libsyntax_ext/deriving/mod.rs @@ -221,7 +221,7 @@ pub fn expand_derive(cx: &mut ExtCtxt, // the old custom derive mechanism. If the feature isn't enabled, we // issue an error, otherwise manufacture the `derive_Foo` attribute. } else if !cx.ecfg.enable_custom_derive() { - feature_gate::emit_feature_err(&cx.parse_sess.span_diagnostic, + feature_gate::emit_feature_err(&cx.parse_sess, "custom_derive", titem.span, feature_gate::GateIssue::Language, diff --git a/src/libsyntax_ext/log_syntax.rs b/src/libsyntax_ext/log_syntax.rs index 7242b9865a92c..71f1951d5d455 100644 --- a/src/libsyntax_ext/log_syntax.rs +++ b/src/libsyntax_ext/log_syntax.rs @@ -19,7 +19,7 @@ pub fn expand_syntax_ext<'cx>(cx: &'cx mut base::ExtCtxt, tts: &[tokenstream::TokenTree]) -> Box { if !cx.ecfg.enable_log_syntax() { - feature_gate::emit_feature_err(&cx.parse_sess.span_diagnostic, + feature_gate::emit_feature_err(&cx.parse_sess, "log_syntax", sp, feature_gate::GateIssue::Language, diff --git a/src/libsyntax_ext/trace_macros.rs b/src/libsyntax_ext/trace_macros.rs index 794169ae3429c..9578af6810078 100644 --- a/src/libsyntax_ext/trace_macros.rs +++ b/src/libsyntax_ext/trace_macros.rs @@ -20,7 +20,7 @@ pub fn expand_trace_macros(cx: &mut ExtCtxt, tt: &[TokenTree]) -> Box { if !cx.ecfg.enable_trace_macros() { - feature_gate::emit_feature_err(&cx.parse_sess.span_diagnostic, + feature_gate::emit_feature_err(&cx.parse_sess, "trace_macros", sp, feature_gate::GateIssue::Language, From 6d09d8d7d93b4c7d4387d8a1510924df1d67c05d Mon Sep 17 00:00:00 2001 From: Tim Neumann Date: Sat, 24 Sep 2016 19:04:07 +0200 Subject: [PATCH 2/8] add unstable_features to ParseSess --- src/libsyntax/feature_gate.rs | 18 ++++++++++++++++++ src/libsyntax/parse/mod.rs | 3 +++ 2 files changed, 21 insertions(+) diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index f8eb4508b1606..2b4f03bd4f6ef 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -36,6 +36,7 @@ use parse::ParseSess; use parse::token::InternedString; use std::ascii::AsciiExt; +use std::env; macro_rules! setter { ($field: ident) => {{ @@ -1296,6 +1297,23 @@ pub enum UnstableFeatures { Cheat } +impl UnstableFeatures { + pub fn from_environment() -> UnstableFeatures { + // 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(); + // The secret key needed to get through the rustc build itself by + // subverting the unstable features lints + let bootstrap_secret_key = option_env!("CFG_BOOTSTRAP_KEY"); + // The matching key to the above, only known by the build system + let bootstrap_provided_key = env::var("RUSTC_BOOTSTRAP_KEY").ok(); + match (disable_unstable_features, bootstrap_secret_key, bootstrap_provided_key) { + (_, Some(ref s), Some(ref p)) if s == p => UnstableFeatures::Cheat, + (true, _, _) => UnstableFeatures::Disallow, + (false, _, _) => UnstableFeatures::Allow + } + } +} + fn maybe_stage_features(span_handler: &Handler, krate: &ast::Crate, unstable: UnstableFeatures) { let allow_features = match unstable { diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index 5aa0efdec11a2..1e286c143de9b 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -14,6 +14,7 @@ use ast; use codemap::CodeMap; use syntax_pos::{self, Span, FileMap}; use errors::{Handler, ColorConfig, DiagnosticBuilder}; +use feature_gate::UnstableFeatures; use parse::parser::Parser; use parse::token::InternedString; use ptr::P; @@ -42,6 +43,7 @@ pub mod obsolete; /// Info about a parsing session. pub struct ParseSess { pub span_diagnostic: Handler, // better be the same as the one in the reader! + pub unstable_features: UnstableFeatures, /// Used to determine and report recursive mod inclusions included_mod_stack: RefCell>, code_map: Rc, @@ -60,6 +62,7 @@ impl ParseSess { pub fn with_span_handler(handler: Handler, code_map: Rc) -> ParseSess { ParseSess { span_diagnostic: handler, + unstable_features: UnstableFeatures::from_environment(), included_mod_stack: RefCell::new(vec![]), code_map: code_map } From ba838dc4e9b8340e73e5c2e34a376f2226ecea9a Mon Sep 17 00:00:00 2001 From: Tim Neumann Date: Sat, 24 Sep 2016 19:19:17 +0200 Subject: [PATCH 3/8] make is_nightly_build a method on UnstableFeatures --- src/librustc/session/config.rs | 5 +---- src/libsyntax/feature_gate.rs | 7 +++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 2e01ec9b0a725..e7dd19d761ebb 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1583,10 +1583,7 @@ pub mod nightly_options { } pub fn is_nightly_build() -> bool { - match get_unstable_features_setting() { - UnstableFeatures::Allow | UnstableFeatures::Cheat => true, - _ => false, - } + UnstableFeatures::from_environment().is_nightly_build() } pub fn check_nightly_options(matches: &getopts::Matches, flags: &[RustcOptGroup]) { diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 2b4f03bd4f6ef..f8b7ad334653d 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -1312,6 +1312,13 @@ impl UnstableFeatures { (false, _, _) => UnstableFeatures::Allow } } + + pub fn is_nightly_build(&self) -> bool { + match *self { + UnstableFeatures::Allow | UnstableFeatures::Cheat => true, + _ => false, + } + } } fn maybe_stage_features(span_handler: &Handler, krate: &ast::Crate, From 3f287efc82e01e7ba4374ef6bb781e5d8461946e Mon Sep 17 00:00:00 2001 From: Tim Neumann Date: Sat, 24 Sep 2016 19:20:57 +0200 Subject: [PATCH 4/8] refactor away get_unstable_features_setting --- src/librustc/session/config.rs | 22 +++------------------- src/librustc_driver/lib.rs | 4 ++-- src/librustdoc/html/markdown.rs | 3 +-- src/librustdoc/html/render.rs | 5 ++--- src/librustdoc/test.rs | 8 ++++---- 5 files changed, 12 insertions(+), 30 deletions(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index e7dd19d761ebb..4e88370931a78 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -37,7 +37,6 @@ use std::collections::btree_map::Iter as BTreeMapIter; use std::collections::btree_map::Keys as BTreeMapKeysIter; use std::collections::btree_map::Values as BTreeMapValuesIter; -use std::env; use std::fmt; use std::hash::{Hasher, SipHasher}; use std::iter::FromIterator; @@ -1525,27 +1524,12 @@ pub fn build_session_options_and_crate_config(matches: &getopts::Matches) crate_name: crate_name, alt_std_name: None, libs: libs, - unstable_features: get_unstable_features_setting(), + unstable_features: UnstableFeatures::from_environment(), debug_assertions: debug_assertions, }, cfg) } -pub fn get_unstable_features_setting() -> UnstableFeatures { - // 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(); - // The secret key needed to get through the rustc build itself by - // subverting the unstable features lints - let bootstrap_secret_key = option_env!("CFG_BOOTSTRAP_KEY"); - // The matching key to the above, only known by the build system - let bootstrap_provided_key = env::var("RUSTC_BOOTSTRAP_KEY").ok(); - match (disable_unstable_features, bootstrap_secret_key, bootstrap_provided_key) { - (_, Some(ref s), Some(ref p)) if s == p => UnstableFeatures::Cheat, - (true, ..) => UnstableFeatures::Disallow, - (false, ..) => UnstableFeatures::Allow - } -} - pub fn parse_crate_types_from_list(list_list: Vec) -> Result, String> { let mut crate_types: Vec = Vec::new(); for unparsed_crate_type in &list_list { @@ -1575,7 +1559,7 @@ pub fn parse_crate_types_from_list(list_list: Vec) -> Result bool { @@ -1588,7 +1572,7 @@ pub mod nightly_options { pub fn check_nightly_options(matches: &getopts::Matches, flags: &[RustcOptGroup]) { let has_z_unstable_option = matches.opt_strs("Z").iter().any(|x| *x == "unstable-options"); - let really_allows_unstable_options = match get_unstable_features_setting() { + let really_allows_unstable_options = match UnstableFeatures::from_environment() { UnstableFeatures::Disallow => false, _ => true, }; diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index 681a7ec5b5ac9..33d57a3127e46 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -73,7 +73,7 @@ use rustc_trans::back::write::{create_target_machine, RELOC_MODEL_ARGS, CODE_GEN use rustc::dep_graph::DepGraph; use rustc::session::{self, config, Session, build_session, CompileResult}; use rustc::session::config::{Input, PrintRequest, OutputType, ErrorOutputType}; -use rustc::session::config::{get_unstable_features_setting, nightly_options}; +use rustc::session::config::nightly_options; use rustc::lint::Lint; use rustc::lint; use rustc_metadata::loader; @@ -649,7 +649,7 @@ impl RustcDefaultCalls { } } PrintRequest::Cfg => { - let allow_unstable_cfg = match get_unstable_features_setting() { + let allow_unstable_cfg = match UnstableFeatures::from_environment() { UnstableFeatures::Disallow => false, _ => true, }; diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index aff5a964f75cc..d923c54ecd2ba 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -27,7 +27,6 @@ #![allow(non_camel_case_types)] use libc; -use rustc::session::config::get_unstable_features_setting; use std::ascii::AsciiExt; use std::cell::RefCell; use std::default::Default; @@ -478,7 +477,7 @@ impl LangString { let mut data = LangString::all_false(); let mut allow_compile_fail = false; let mut allow_error_code_check = false; - match get_unstable_features_setting() { + match UnstableFeatures::from_environment() { UnstableFeatures::Allow | UnstableFeatures::Cheat => { allow_compile_fail = true; allow_error_code_check = true; diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 03d772d1a6db3..9c80f6e98c39c 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -58,7 +58,6 @@ use syntax::feature_gate::UnstableFeatures; use rustc::hir::def_id::{CrateNum, CRATE_DEF_INDEX, DefId, LOCAL_CRATE}; use rustc::middle::privacy::AccessLevels; use rustc::middle::stability; -use rustc::session::config::get_unstable_features_setting; use rustc::hir; use rustc::util::nodemap::{FnvHashMap, FnvHashSet}; use rustc_data_structures::flock; @@ -1971,7 +1970,7 @@ fn item_static(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, fn item_function(w: &mut fmt::Formatter, cx: &Context, it: &clean::Item, f: &clean::Function) -> fmt::Result { // FIXME(#24111): remove when `const_fn` is stabilized - let vis_constness = match get_unstable_features_setting() { + let vis_constness = match UnstableFeatures::from_environment() { UnstableFeatures::Allow => f.constness, _ => hir::Constness::NotConst }; @@ -2250,7 +2249,7 @@ fn render_assoc_item(w: &mut fmt::Formatter, } }; // FIXME(#24111): remove when `const_fn` is stabilized - let vis_constness = match get_unstable_features_setting() { + let vis_constness = match UnstableFeatures::from_environment() { UnstableFeatures::Allow => constness, _ => hir::Constness::NotConst }; diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index 4518945dd9857..1ab86cf7e8920 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -25,8 +25,7 @@ use rustc_lint; use rustc::dep_graph::DepGraph; use rustc::hir::map as hir_map; use rustc::session::{self, config}; -use rustc::session::config::{get_unstable_features_setting, OutputType, - OutputTypes, Externs}; +use rustc::session::config::{OutputType, OutputTypes, Externs}; use rustc::session::search_paths::{SearchPaths, PathKind}; use rustc_back::dynamic_lib::DynamicLibrary; use rustc_back::tempdir::TempDir; @@ -35,6 +34,7 @@ use rustc_driver::driver::phase_2_configure_and_expand; use rustc_metadata::cstore::CStore; use rustc_resolve::MakeGlobMap; use syntax::codemap::CodeMap; +use syntax::feature_gate::UnstableFeatures; use errors; use errors::emitter::ColorConfig; @@ -68,7 +68,7 @@ pub fn run(input: &str, search_paths: libs.clone(), crate_types: vec!(config::CrateTypeDylib), externs: externs.clone(), - unstable_features: get_unstable_features_setting(), + unstable_features: UnstableFeatures::from_environment(), ..config::basic_options().clone() }; @@ -197,7 +197,7 @@ fn runtest(test: &str, cratename: &str, cfgs: Vec, libs: SearchPaths, .. config::basic_codegen_options() }, test: as_test_harness, - unstable_features: get_unstable_features_setting(), + unstable_features: UnstableFeatures::from_environment(), ..config::basic_options().clone() }; From ad81f11b01164d7a9660243d14e9d480e3e4275f Mon Sep 17 00:00:00 2001 From: Tim Neumann Date: Sat, 24 Sep 2016 19:26:18 +0200 Subject: [PATCH 5/8] deduplicate inline is_nightly_build implementations --- src/librustc/session/config.rs | 5 +---- src/librustc_driver/lib.rs | 5 +---- src/librustdoc/html/markdown.rs | 11 ++++------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 4e88370931a78..d866ead8e3b6c 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1572,10 +1572,7 @@ pub mod nightly_options { pub fn check_nightly_options(matches: &getopts::Matches, flags: &[RustcOptGroup]) { let has_z_unstable_option = matches.opt_strs("Z").iter().any(|x| *x == "unstable-options"); - let really_allows_unstable_options = match UnstableFeatures::from_environment() { - UnstableFeatures::Disallow => false, - _ => true, - }; + let really_allows_unstable_options = UnstableFeatures::from_environment().is_nightly_build(); for opt in flags.iter() { if opt.stability == OptionStability::Stable { diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index 33d57a3127e46..df2219b73cd81 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -649,10 +649,7 @@ impl RustcDefaultCalls { } } PrintRequest::Cfg => { - let allow_unstable_cfg = match UnstableFeatures::from_environment() { - UnstableFeatures::Disallow => false, - _ => true, - }; + let allow_unstable_cfg = UnstableFeatures::from_environment().is_nightly_build(); for cfg in cfg { if !allow_unstable_cfg && GatedCfg::gate(&*cfg).is_some() { diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index d923c54ecd2ba..e9a1f650c9b2f 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -477,13 +477,10 @@ impl LangString { let mut data = LangString::all_false(); let mut allow_compile_fail = false; let mut allow_error_code_check = false; - match UnstableFeatures::from_environment() { - UnstableFeatures::Allow | UnstableFeatures::Cheat => { - allow_compile_fail = true; - allow_error_code_check = true; - } - _ => {}, - }; + if UnstableFeatures::from_environment().is_nightly_build() { + allow_compile_fail = true; + allow_error_code_check = true; + } let tokens = string.split(|c: char| !(c == '_' || c == '-' || c.is_alphanumeric()) From 0dc2a95f1e3237dddc5fe860b4150c5088ba3e24 Mon Sep 17 00:00:00 2001 From: Tim Neumann Date: Sat, 24 Sep 2016 19:28:46 +0200 Subject: [PATCH 6/8] emit feature help in cheat mode --- src/libsyntax/feature_gate.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index f8b7ad334653d..b687e4f92be73 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -804,13 +804,12 @@ pub fn emit_feature_err(sess: &ParseSess, feature: &str, span: Span, issue: Gate }; // #23973: do not suggest `#![feature(...)]` if we are in beta/stable - if option_env!("CFG_DISABLE_UNSTABLE_FEATURES").is_some() { - err.emit(); - return; + if sess.unstable_features.is_nightly_build() { + err.help(&format!("add #![feature({})] to the \ + crate attributes to enable", + feature)); } - err.help(&format!("add #![feature({})] to the \ - crate attributes to enable", - feature)); + err.emit(); } From cf1fc2ce13793290240374f1e49613a5b8ce598c Mon Sep 17 00:00:00 2001 From: Tim Neumann Date: Sat, 24 Sep 2016 21:03:25 +0200 Subject: [PATCH 7/8] appease tidy --- src/librustc/session/config.rs | 3 ++- src/librustc_driver/lib.rs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index d866ead8e3b6c..87f0c8b67a0ec 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1572,7 +1572,8 @@ pub mod nightly_options { pub fn check_nightly_options(matches: &getopts::Matches, flags: &[RustcOptGroup]) { let has_z_unstable_option = matches.opt_strs("Z").iter().any(|x| *x == "unstable-options"); - let really_allows_unstable_options = UnstableFeatures::from_environment().is_nightly_build(); + let really_allows_unstable_options = UnstableFeatures::from_environment() + .is_nightly_build(); for opt in flags.iter() { if opt.stability == OptionStability::Stable { diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index df2219b73cd81..5089af892859b 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -649,7 +649,8 @@ impl RustcDefaultCalls { } } PrintRequest::Cfg => { - let allow_unstable_cfg = UnstableFeatures::from_environment().is_nightly_build(); + let allow_unstable_cfg = UnstableFeatures::from_environment() + .is_nightly_build(); for cfg in cfg { if !allow_unstable_cfg && GatedCfg::gate(&*cfg).is_some() { From f0e1738e5188b53d6af809481bea58f578bfdbe2 Mon Sep 17 00:00:00 2001 From: Tim Neumann Date: Mon, 26 Sep 2016 17:21:45 +0200 Subject: [PATCH 8/8] fix rebase fallout --- src/librustc_resolve/macros.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index 37cb2861c1c0a..9240c35bfe479 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -146,9 +146,9 @@ impl<'a> Resolver<'a> { fn insert_custom_derive(&mut self, name: &str, ext: Rc, sp: Span) { if !self.session.features.borrow().rustc_macro { - let diagnostic = &self.session.parse_sess.span_diagnostic; + let sess = &self.session.parse_sess; let msg = "loading custom derive macro crates is experimentally supported"; - emit_feature_err(diagnostic, "rustc_macro", sp, feature_gate::GateIssue::Language, msg); + emit_feature_err(sess, "rustc_macro", sp, feature_gate::GateIssue::Language, msg); } if self.derive_modes.insert(token::intern(name), ext).is_some() { self.session.span_err(sp, &format!("cannot shadow existing derive mode `{}`", name));