mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Allow making RUSTC_BOOTSTRAP
conditional on the crate name
The main change is that `UnstableOptions::from_environment` now requires an (optional) crate name. If the crate name is unknown (`None`), then the new feature is not available and you still have to use `RUSTC_BOOTSTRAP=1`. In practice this means the feature is only available for `--crate-name`, not for `#![crate_name]`; I'm interested in supporting the second but I'm not sure how. Other major changes: - Added `Session::is_nightly_build()`, which uses the `crate_name` of the session - Added `nightly_options::match_is_nightly_build`, a convenience method for looking up `--crate-name` from CLI arguments. `Session::is_nightly_build()`should be preferred where possible, since it will take into account `#![crate_name]` (I think). - Added `unstable_features` to `rustdoc::RenderOptions` There is a user-facing change here: things like `RUSTC_BOOTSTRAP=0` no longer active nightly features. In practice this shouldn't be a big deal, since `RUSTC_BOOTSTRAP` is the opposite of stable and everyone uses `RUSTC_BOOTSTRAP=1` anyway. - Add tests Check against `Cheat`, not whether nightly features are allowed. Nightly features are always allowed on the nightly channel. - Only call `is_nightly_build()` once within a function - Use booleans consistently for rustc_incremental Sessions can't be passed through threads, so `read_file` couldn't take a session. To be consistent, also take a boolean in `write_file_header`.
This commit is contained in:
parent
dc06a36074
commit
622c48e4f1
@ -53,7 +53,6 @@ use rustc_hir::definitions::{DefKey, DefPathData, Definitions};
|
|||||||
use rustc_hir::intravisit;
|
use rustc_hir::intravisit;
|
||||||
use rustc_hir::{ConstArg, GenericArg, ParamName};
|
use rustc_hir::{ConstArg, GenericArg, ParamName};
|
||||||
use rustc_index::vec::{Idx, IndexVec};
|
use rustc_index::vec::{Idx, IndexVec};
|
||||||
use rustc_session::config::nightly_options;
|
|
||||||
use rustc_session::lint::{builtin::BARE_TRAIT_OBJECTS, BuiltinLintDiagnostics, LintBuffer};
|
use rustc_session::lint::{builtin::BARE_TRAIT_OBJECTS, BuiltinLintDiagnostics, LintBuffer};
|
||||||
use rustc_session::parse::ParseSess;
|
use rustc_session::parse::ParseSess;
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
@ -1395,8 +1394,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||||||
"`impl Trait` not allowed outside of {}",
|
"`impl Trait` not allowed outside of {}",
|
||||||
allowed_in,
|
allowed_in,
|
||||||
);
|
);
|
||||||
if pos == ImplTraitPosition::Binding && nightly_options::is_nightly_build()
|
if pos == ImplTraitPosition::Binding && self.sess.is_nightly_build() {
|
||||||
{
|
|
||||||
err.help(
|
err.help(
|
||||||
"add `#![feature(impl_trait_in_bindings)]` to the crate \
|
"add `#![feature(impl_trait_in_bindings)]` to the crate \
|
||||||
attributes to enable",
|
attributes to enable",
|
||||||
|
@ -3,7 +3,6 @@ use crate::llvm;
|
|||||||
use libc::c_int;
|
use libc::c_int;
|
||||||
use rustc_codegen_ssa::target_features::supported_target_features;
|
use rustc_codegen_ssa::target_features::supported_target_features;
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_feature::UnstableFeatures;
|
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_session::config::PrintRequest;
|
use rustc_session::config::PrintRequest;
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
@ -154,13 +153,11 @@ pub fn target_features(sess: &Session) -> Vec<Symbol> {
|
|||||||
let target_machine = create_informational_target_machine(sess);
|
let target_machine = create_informational_target_machine(sess);
|
||||||
supported_target_features(sess)
|
supported_target_features(sess)
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|&(feature, gate)| {
|
.filter_map(
|
||||||
if UnstableFeatures::from_environment().is_nightly_build() || gate.is_none() {
|
|&(feature, gate)| {
|
||||||
Some(feature)
|
if sess.is_nightly_build() || gate.is_none() { Some(feature) } else { None }
|
||||||
} else {
|
},
|
||||||
None
|
)
|
||||||
}
|
|
||||||
})
|
|
||||||
.filter(|feature| {
|
.filter(|feature| {
|
||||||
let llvm_feature = to_llvm_feature(sess, feature);
|
let llvm_feature = to_llvm_feature(sess, feature);
|
||||||
let cstr = CString::new(llvm_feature).unwrap();
|
let cstr = CString::new(llvm_feature).unwrap();
|
||||||
|
@ -20,7 +20,7 @@ use rustc_data_structures::profiling::print_time_passes_entry;
|
|||||||
use rustc_data_structures::sync::SeqCst;
|
use rustc_data_structures::sync::SeqCst;
|
||||||
use rustc_errors::registry::{InvalidErrorCode, Registry};
|
use rustc_errors::registry::{InvalidErrorCode, Registry};
|
||||||
use rustc_errors::{ErrorReported, PResult};
|
use rustc_errors::{ErrorReported, PResult};
|
||||||
use rustc_feature::{find_gated_cfg, UnstableFeatures};
|
use rustc_feature::find_gated_cfg;
|
||||||
use rustc_hir::def_id::LOCAL_CRATE;
|
use rustc_hir::def_id::LOCAL_CRATE;
|
||||||
use rustc_interface::util::{self, collect_crate_types, get_builtin_codegen_backend};
|
use rustc_interface::util::{self, collect_crate_types, get_builtin_codegen_backend};
|
||||||
use rustc_interface::{interface, Queries};
|
use rustc_interface::{interface, Queries};
|
||||||
@ -746,9 +746,6 @@ impl RustcDefaultCalls {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Cfg => {
|
Cfg => {
|
||||||
let allow_unstable_cfg =
|
|
||||||
UnstableFeatures::from_environment().is_nightly_build();
|
|
||||||
|
|
||||||
let mut cfgs = sess
|
let mut cfgs = sess
|
||||||
.parse_sess
|
.parse_sess
|
||||||
.config
|
.config
|
||||||
@ -763,7 +760,7 @@ impl RustcDefaultCalls {
|
|||||||
// it, this is intended to get into Cargo and then go
|
// it, this is intended to get into Cargo and then go
|
||||||
// through to build scripts.
|
// through to build scripts.
|
||||||
if (name != sym::target_feature || value != Some(sym::crt_dash_static))
|
if (name != sym::target_feature || value != Some(sym::crt_dash_static))
|
||||||
&& !allow_unstable_cfg
|
&& !sess.is_nightly_build()
|
||||||
&& find_gated_cfg(|cfg_sym| cfg_sym == name).is_some()
|
&& find_gated_cfg(|cfg_sym| cfg_sym == name).is_some()
|
||||||
{
|
{
|
||||||
return None;
|
return None;
|
||||||
@ -814,14 +811,14 @@ pub fn version(binary: &str, matches: &getopts::Matches) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn usage(verbose: bool, include_unstable_options: bool) {
|
fn usage(verbose: bool, include_unstable_options: bool, nightly_build: bool) {
|
||||||
let groups = if verbose { config::rustc_optgroups() } else { config::rustc_short_optgroups() };
|
let groups = if verbose { config::rustc_optgroups() } else { config::rustc_short_optgroups() };
|
||||||
let mut options = getopts::Options::new();
|
let mut options = getopts::Options::new();
|
||||||
for option in groups.iter().filter(|x| include_unstable_options || x.is_stable()) {
|
for option in groups.iter().filter(|x| include_unstable_options || x.is_stable()) {
|
||||||
(option.apply)(&mut options);
|
(option.apply)(&mut options);
|
||||||
}
|
}
|
||||||
let message = "Usage: rustc [OPTIONS] INPUT";
|
let message = "Usage: rustc [OPTIONS] INPUT";
|
||||||
let nightly_help = if nightly_options::is_nightly_build() {
|
let nightly_help = if nightly_build {
|
||||||
"\n -Z help Print unstable compiler options"
|
"\n -Z help Print unstable compiler options"
|
||||||
} else {
|
} else {
|
||||||
""
|
""
|
||||||
@ -831,7 +828,7 @@ fn usage(verbose: bool, include_unstable_options: bool) {
|
|||||||
} else {
|
} else {
|
||||||
"\n --help -v Print the full set of options rustc accepts"
|
"\n --help -v Print the full set of options rustc accepts"
|
||||||
};
|
};
|
||||||
let at_path = if verbose && nightly_options::is_nightly_build() {
|
let at_path = if verbose && nightly_build {
|
||||||
" @path Read newline separated options from `path`\n"
|
" @path Read newline separated options from `path`\n"
|
||||||
} else {
|
} else {
|
||||||
""
|
""
|
||||||
@ -1034,7 +1031,9 @@ pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
|
|||||||
if args.is_empty() {
|
if args.is_empty() {
|
||||||
// user did not write `-v` nor `-Z unstable-options`, so do not
|
// user did not write `-v` nor `-Z unstable-options`, so do not
|
||||||
// include that extra information.
|
// include that extra information.
|
||||||
usage(false, false);
|
let nightly_build =
|
||||||
|
rustc_feature::UnstableFeatures::from_environment(None).is_nightly_build();
|
||||||
|
usage(false, false, nightly_build);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1063,7 +1062,9 @@ pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
|
|||||||
|
|
||||||
if matches.opt_present("h") || matches.opt_present("help") {
|
if matches.opt_present("h") || matches.opt_present("help") {
|
||||||
// Only show unstable options in --help if we accept unstable options.
|
// Only show unstable options in --help if we accept unstable options.
|
||||||
usage(matches.opt_present("verbose"), nightly_options::is_unstable_enabled(&matches));
|
let unstable_enabled = nightly_options::is_unstable_enabled(&matches);
|
||||||
|
let nightly_build = nightly_options::match_is_nightly_build(&matches);
|
||||||
|
usage(matches.opt_present("verbose"), unstable_enabled, nightly_build);
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ pub enum Stability {
|
|||||||
Deprecated(&'static str, Option<&'static str>),
|
Deprecated(&'static str, Option<&'static str>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Hash)]
|
#[derive(Clone, Copy, Debug, Hash)]
|
||||||
pub enum UnstableFeatures {
|
pub enum UnstableFeatures {
|
||||||
/// Hard errors for unstable features are active, as on beta/stable channels.
|
/// Hard errors for unstable features are active, as on beta/stable channels.
|
||||||
Disallow,
|
Disallow,
|
||||||
@ -73,11 +73,20 @@ pub enum UnstableFeatures {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl UnstableFeatures {
|
impl UnstableFeatures {
|
||||||
pub fn from_environment() -> UnstableFeatures {
|
/// This takes into account `RUSTC_BOOTSTRAP`.
|
||||||
|
///
|
||||||
|
/// If `krate` is [`Some`], then setting `RUSTC_BOOTSTRAP=krate` will enable the nightly features.
|
||||||
|
/// Otherwise, only `RUSTC_BOOTSTRAP=1` will work.
|
||||||
|
pub fn from_environment(krate: Option<&str>) -> Self {
|
||||||
// `true` if this is a feature-staged build, i.e., on the beta or stable channel.
|
// `true` if 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();
|
let disable_unstable_features = option_env!("CFG_DISABLE_UNSTABLE_FEATURES").is_some();
|
||||||
|
// Returns whether `krate` should be counted as unstable
|
||||||
|
let is_unstable_crate = |var: &str| {
|
||||||
|
krate.map_or(false, |name| var.split(',').any(|new_krate| new_krate == name))
|
||||||
|
};
|
||||||
// `true` if we should enable unstable features for bootstrapping.
|
// `true` if we should enable unstable features for bootstrapping.
|
||||||
let bootstrap = std::env::var("RUSTC_BOOTSTRAP").is_ok();
|
let bootstrap = std::env::var("RUSTC_BOOTSTRAP")
|
||||||
|
.map_or(false, |var| var == "1" || is_unstable_crate(&var));
|
||||||
match (disable_unstable_features, bootstrap) {
|
match (disable_unstable_features, bootstrap) {
|
||||||
(_, true) => UnstableFeatures::Cheat,
|
(_, true) => UnstableFeatures::Cheat,
|
||||||
(true, _) => UnstableFeatures::Disallow,
|
(true, _) => UnstableFeatures::Disallow,
|
||||||
@ -140,3 +149,30 @@ pub use builtin_attrs::{
|
|||||||
AttributeType, BuiltinAttribute, GatedCfg, BUILTIN_ATTRIBUTES, BUILTIN_ATTRIBUTE_MAP,
|
AttributeType, BuiltinAttribute, GatedCfg, BUILTIN_ATTRIBUTES, BUILTIN_ATTRIBUTE_MAP,
|
||||||
};
|
};
|
||||||
pub use removed::{REMOVED_FEATURES, STABLE_REMOVED_FEATURES};
|
pub use removed::{REMOVED_FEATURES, STABLE_REMOVED_FEATURES};
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::UnstableFeatures;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn rustc_bootstrap_parsing() {
|
||||||
|
let is_bootstrap = |env, krate| {
|
||||||
|
std::env::set_var("RUSTC_BOOTSTRAP", env);
|
||||||
|
matches!(UnstableFeatures::from_environment(krate), UnstableFeatures::Cheat)
|
||||||
|
};
|
||||||
|
assert!(is_bootstrap("1", None));
|
||||||
|
assert!(is_bootstrap("1", Some("x")));
|
||||||
|
// RUSTC_BOOTSTRAP allows specifying a specific crate
|
||||||
|
assert!(is_bootstrap("x", Some("x")));
|
||||||
|
// RUSTC_BOOTSTRAP allows multiple comma-delimited crates
|
||||||
|
assert!(is_bootstrap("x,y,z", Some("x")));
|
||||||
|
assert!(is_bootstrap("x,y,z", Some("y")));
|
||||||
|
// Crate that aren't specified do not get unstable features
|
||||||
|
assert!(!is_bootstrap("x", Some("a")));
|
||||||
|
assert!(!is_bootstrap("x,y,z", Some("a")));
|
||||||
|
assert!(!is_bootstrap("x,y,z", None));
|
||||||
|
|
||||||
|
// this is technically a breaking change, but there are no stability guarantees for RUSTC_BOOTSTRAP
|
||||||
|
assert!(!is_bootstrap("0", None));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -15,7 +15,6 @@ use std::io::{self, Read};
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use rustc_serialize::opaque::Encoder;
|
use rustc_serialize::opaque::Encoder;
|
||||||
use rustc_session::config::nightly_options;
|
|
||||||
|
|
||||||
/// The first few bytes of files generated by incremental compilation.
|
/// The first few bytes of files generated by incremental compilation.
|
||||||
const FILE_MAGIC: &[u8] = b"RSIC";
|
const FILE_MAGIC: &[u8] = b"RSIC";
|
||||||
@ -28,12 +27,12 @@ const HEADER_FORMAT_VERSION: u16 = 0;
|
|||||||
/// the Git commit hash.
|
/// the Git commit hash.
|
||||||
const RUSTC_VERSION: Option<&str> = option_env!("CFG_VERSION");
|
const RUSTC_VERSION: Option<&str> = option_env!("CFG_VERSION");
|
||||||
|
|
||||||
pub fn write_file_header(stream: &mut Encoder) {
|
pub fn write_file_header(stream: &mut Encoder, nightly_build: bool) {
|
||||||
stream.emit_raw_bytes(FILE_MAGIC);
|
stream.emit_raw_bytes(FILE_MAGIC);
|
||||||
stream
|
stream
|
||||||
.emit_raw_bytes(&[(HEADER_FORMAT_VERSION >> 0) as u8, (HEADER_FORMAT_VERSION >> 8) as u8]);
|
.emit_raw_bytes(&[(HEADER_FORMAT_VERSION >> 0) as u8, (HEADER_FORMAT_VERSION >> 8) as u8]);
|
||||||
|
|
||||||
let rustc_version = rustc_version();
|
let rustc_version = rustc_version(nightly_build);
|
||||||
assert_eq!(rustc_version.len(), (rustc_version.len() as u8) as usize);
|
assert_eq!(rustc_version.len(), (rustc_version.len() as u8) as usize);
|
||||||
stream.emit_raw_bytes(&[rustc_version.len() as u8]);
|
stream.emit_raw_bytes(&[rustc_version.len() as u8]);
|
||||||
stream.emit_raw_bytes(rustc_version.as_bytes());
|
stream.emit_raw_bytes(rustc_version.as_bytes());
|
||||||
@ -51,6 +50,7 @@ pub fn write_file_header(stream: &mut Encoder) {
|
|||||||
pub fn read_file(
|
pub fn read_file(
|
||||||
report_incremental_info: bool,
|
report_incremental_info: bool,
|
||||||
path: &Path,
|
path: &Path,
|
||||||
|
nightly_build: bool,
|
||||||
) -> io::Result<Option<(Vec<u8>, usize)>> {
|
) -> io::Result<Option<(Vec<u8>, usize)>> {
|
||||||
if !path.exists() {
|
if !path.exists() {
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
@ -93,7 +93,7 @@ pub fn read_file(
|
|||||||
let mut buffer = vec![0; rustc_version_str_len];
|
let mut buffer = vec![0; rustc_version_str_len];
|
||||||
file.read_exact(&mut buffer)?;
|
file.read_exact(&mut buffer)?;
|
||||||
|
|
||||||
if buffer != rustc_version().as_bytes() {
|
if buffer != rustc_version(nightly_build).as_bytes() {
|
||||||
report_format_mismatch(report_incremental_info, path, "Different compiler version");
|
report_format_mismatch(report_incremental_info, path, "Different compiler version");
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
@ -115,8 +115,8 @@ fn report_format_mismatch(report_incremental_info: bool, file: &Path, message: &
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn rustc_version() -> String {
|
fn rustc_version(nightly_build: bool) -> String {
|
||||||
if nightly_options::is_nightly_build() {
|
if nightly_build {
|
||||||
if let Some(val) = env::var_os("RUSTC_FORCE_INCR_COMP_ARTIFACT_HEADER") {
|
if let Some(val) = env::var_os("RUSTC_FORCE_INCR_COMP_ARTIFACT_HEADER") {
|
||||||
return val.to_string_lossy().into_owned();
|
return val.to_string_lossy().into_owned();
|
||||||
}
|
}
|
||||||
|
@ -53,8 +53,12 @@ impl LoadResult<(PreviousDepGraph, WorkProductMap)> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_data(report_incremental_info: bool, path: &Path) -> LoadResult<(Vec<u8>, usize)> {
|
fn load_data(
|
||||||
match file_format::read_file(report_incremental_info, path) {
|
report_incremental_info: bool,
|
||||||
|
path: &Path,
|
||||||
|
nightly_build: bool,
|
||||||
|
) -> LoadResult<(Vec<u8>, usize)> {
|
||||||
|
match file_format::read_file(report_incremental_info, path, nightly_build) {
|
||||||
Ok(Some(data_and_pos)) => LoadResult::Ok { data: data_and_pos },
|
Ok(Some(data_and_pos)) => LoadResult::Ok { data: data_and_pos },
|
||||||
Ok(None) => {
|
Ok(None) => {
|
||||||
// The file either didn't exist or was produced by an incompatible
|
// The file either didn't exist or was produced by an incompatible
|
||||||
@ -111,13 +115,14 @@ pub fn load_dep_graph(sess: &Session) -> DepGraphFuture {
|
|||||||
let expected_hash = sess.opts.dep_tracking_hash();
|
let expected_hash = sess.opts.dep_tracking_hash();
|
||||||
|
|
||||||
let mut prev_work_products = FxHashMap::default();
|
let mut prev_work_products = FxHashMap::default();
|
||||||
|
let nightly_build = sess.is_nightly_build();
|
||||||
|
|
||||||
// If we are only building with -Zquery-dep-graph but without an actual
|
// If we are only building with -Zquery-dep-graph but without an actual
|
||||||
// incr. comp. session directory, we skip this. Otherwise we'd fail
|
// incr. comp. session directory, we skip this. Otherwise we'd fail
|
||||||
// when trying to load work products.
|
// when trying to load work products.
|
||||||
if sess.incr_comp_session_dir_opt().is_some() {
|
if sess.incr_comp_session_dir_opt().is_some() {
|
||||||
let work_products_path = work_products_path(sess);
|
let work_products_path = work_products_path(sess);
|
||||||
let load_result = load_data(report_incremental_info, &work_products_path);
|
let load_result = load_data(report_incremental_info, &work_products_path, nightly_build);
|
||||||
|
|
||||||
if let LoadResult::Ok { data: (work_products_data, start_pos) } = load_result {
|
if let LoadResult::Ok { data: (work_products_data, start_pos) } = load_result {
|
||||||
// Decode the list of work_products
|
// Decode the list of work_products
|
||||||
@ -163,7 +168,7 @@ pub fn load_dep_graph(sess: &Session) -> DepGraphFuture {
|
|||||||
MaybeAsync::Async(std::thread::spawn(move || {
|
MaybeAsync::Async(std::thread::spawn(move || {
|
||||||
let _prof_timer = prof.generic_activity("incr_comp_load_dep_graph");
|
let _prof_timer = prof.generic_activity("incr_comp_load_dep_graph");
|
||||||
|
|
||||||
match load_data(report_incremental_info, &path) {
|
match load_data(report_incremental_info, &path, nightly_build) {
|
||||||
LoadResult::DataOutOfDate => LoadResult::DataOutOfDate,
|
LoadResult::DataOutOfDate => LoadResult::DataOutOfDate,
|
||||||
LoadResult::Error { message } => LoadResult::Error { message },
|
LoadResult::Error { message } => LoadResult::Error { message },
|
||||||
LoadResult::Ok { data: (bytes, start_pos) } => {
|
LoadResult::Ok { data: (bytes, start_pos) } => {
|
||||||
@ -201,7 +206,11 @@ pub fn load_query_result_cache(sess: &Session) -> OnDiskCache<'_> {
|
|||||||
|
|
||||||
let _prof_timer = sess.prof.generic_activity("incr_comp_load_query_result_cache");
|
let _prof_timer = sess.prof.generic_activity("incr_comp_load_query_result_cache");
|
||||||
|
|
||||||
match load_data(sess.opts.debugging_opts.incremental_info, &query_cache_path(sess)) {
|
match load_data(
|
||||||
|
sess.opts.debugging_opts.incremental_info,
|
||||||
|
&query_cache_path(sess),
|
||||||
|
sess.is_nightly_build(),
|
||||||
|
) {
|
||||||
LoadResult::Ok { data: (bytes, start_pos) } => OnDiskCache::new(sess, bytes, start_pos),
|
LoadResult::Ok { data: (bytes, start_pos) } => OnDiskCache::new(sess, bytes, start_pos),
|
||||||
_ => OnDiskCache::new_empty(sess.source_map()),
|
_ => OnDiskCache::new_empty(sess.source_map()),
|
||||||
}
|
}
|
||||||
|
@ -119,7 +119,7 @@ where
|
|||||||
|
|
||||||
// generate the data in a memory buffer
|
// generate the data in a memory buffer
|
||||||
let mut encoder = Encoder::new(Vec::new());
|
let mut encoder = Encoder::new(Vec::new());
|
||||||
file_format::write_file_header(&mut encoder);
|
file_format::write_file_header(&mut encoder, sess.is_nightly_build());
|
||||||
encode(&mut encoder);
|
encode(&mut encoder);
|
||||||
|
|
||||||
// write the data out
|
// write the data out
|
||||||
|
@ -4,7 +4,6 @@ use rustc_errors::{struct_span_err, DiagnosticBuilder};
|
|||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_middle::mir;
|
use rustc_middle::mir;
|
||||||
use rustc_session::config::nightly_options;
|
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
use rustc_span::symbol::sym;
|
use rustc_span::symbol::sym;
|
||||||
use rustc_span::{Span, Symbol};
|
use rustc_span::{Span, Symbol};
|
||||||
@ -104,7 +103,7 @@ impl NonConstOp for FnCallUnstable {
|
|||||||
|
|
||||||
if ccx.is_const_stable_const_fn() {
|
if ccx.is_const_stable_const_fn() {
|
||||||
err.help("Const-stable functions can only call other const-stable functions");
|
err.help("Const-stable functions can only call other const-stable functions");
|
||||||
} else if nightly_options::is_nightly_build() {
|
} else if ccx.tcx.sess.is_nightly_build() {
|
||||||
if let Some(feature) = feature {
|
if let Some(feature) = feature {
|
||||||
err.help(&format!(
|
err.help(&format!(
|
||||||
"add `#![feature({})]` to the crate attributes to enable",
|
"add `#![feature({})]` to the crate attributes to enable",
|
||||||
|
@ -12,7 +12,6 @@ use rustc_hir::def_id::DefId;
|
|||||||
use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
|
use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
|
||||||
use rustc_hir::{HirId, Pat};
|
use rustc_hir::{HirId, Pat};
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_session::config::nightly_options;
|
|
||||||
use rustc_session::lint::builtin::BINDINGS_WITH_VARIANT_NAME;
|
use rustc_session::lint::builtin::BINDINGS_WITH_VARIANT_NAME;
|
||||||
use rustc_session::lint::builtin::{IRREFUTABLE_LET_PATTERNS, UNREACHABLE_PATTERNS};
|
use rustc_session::lint::builtin::{IRREFUTABLE_LET_PATTERNS, UNREACHABLE_PATTERNS};
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
@ -498,7 +497,7 @@ fn check_exhaustive<'p, 'tcx>(
|
|||||||
so a wildcard `_` is necessary to match exhaustively",
|
so a wildcard `_` is necessary to match exhaustively",
|
||||||
scrut_ty,
|
scrut_ty,
|
||||||
));
|
));
|
||||||
if nightly_options::is_nightly_build() {
|
if cx.tcx.sess.is_nightly_build() {
|
||||||
err.help(&format!(
|
err.help(&format!(
|
||||||
"add `#![feature(precise_pointer_size_matching)]` \
|
"add `#![feature(precise_pointer_size_matching)]` \
|
||||||
to the crate attributes to enable precise `{}` matching",
|
to the crate attributes to enable precise `{}` matching",
|
||||||
|
@ -15,7 +15,6 @@ use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
|
|||||||
use rustc_middle::hir::map::Map;
|
use rustc_middle::hir::map::Map;
|
||||||
use rustc_middle::ty::query::Providers;
|
use rustc_middle::ty::query::Providers;
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_session::config::nightly_options;
|
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
use rustc_span::{sym, Span, Symbol};
|
use rustc_span::{sym, Span, Symbol};
|
||||||
|
|
||||||
@ -145,7 +144,7 @@ impl<'tcx> CheckConstVisitor<'tcx> {
|
|||||||
//
|
//
|
||||||
// FIXME(ecstaticmorse): Maybe this could be incorporated into `feature_err`? This
|
// FIXME(ecstaticmorse): Maybe this could be incorporated into `feature_err`? This
|
||||||
// is a pretty narrow case, however.
|
// is a pretty narrow case, however.
|
||||||
if nightly_options::is_nightly_build() {
|
if tcx.sess.is_nightly_build() {
|
||||||
for gate in missing_secondary {
|
for gate in missing_secondary {
|
||||||
let note = format!(
|
let note = format!(
|
||||||
"add `#![feature({})]` to the crate attributes to enable",
|
"add `#![feature({})]` to the crate attributes to enable",
|
||||||
|
@ -16,7 +16,6 @@ use rustc_hir::def::Namespace::{self, *};
|
|||||||
use rustc_hir::def::{self, CtorKind, CtorOf, DefKind};
|
use rustc_hir::def::{self, CtorKind, CtorOf, DefKind};
|
||||||
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE};
|
use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE};
|
||||||
use rustc_hir::PrimTy;
|
use rustc_hir::PrimTy;
|
||||||
use rustc_session::config::nightly_options;
|
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
use rustc_span::hygiene::MacroKind;
|
use rustc_span::hygiene::MacroKind;
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
@ -890,7 +889,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
|
|||||||
}
|
}
|
||||||
(Res::Def(DefKind::TyAlias, def_id), PathSource::Trait(_)) => {
|
(Res::Def(DefKind::TyAlias, def_id), PathSource::Trait(_)) => {
|
||||||
err.span_label(span, "type aliases cannot be used as traits");
|
err.span_label(span, "type aliases cannot be used as traits");
|
||||||
if nightly_options::is_nightly_build() {
|
if self.r.session.is_nightly_build() {
|
||||||
let msg = "you might have meant to use `#![feature(trait_alias)]` instead of a \
|
let msg = "you might have meant to use `#![feature(trait_alias)]` instead of a \
|
||||||
`type` alias";
|
`type` alias";
|
||||||
if let Some(span) = self.def_span(def_id) {
|
if let Some(span) = self.def_span(def_id) {
|
||||||
@ -1675,7 +1674,7 @@ impl<'tcx> LifetimeContext<'_, 'tcx> {
|
|||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if nightly_options::is_nightly_build()
|
if self.tcx.sess.is_nightly_build()
|
||||||
&& !self.tcx.features().in_band_lifetimes
|
&& !self.tcx.features().in_band_lifetimes
|
||||||
&& suggests_in_band
|
&& suggests_in_band
|
||||||
{
|
{
|
||||||
|
@ -1247,7 +1247,7 @@ fn parse_crate_edition(matches: &getopts::Matches) -> Edition {
|
|||||||
None => DEFAULT_EDITION,
|
None => DEFAULT_EDITION,
|
||||||
};
|
};
|
||||||
|
|
||||||
if !edition.is_stable() && !nightly_options::is_nightly_build() {
|
if !edition.is_stable() && !nightly_options::match_is_nightly_build(matches) {
|
||||||
early_error(
|
early_error(
|
||||||
ErrorOutputType::default(),
|
ErrorOutputType::default(),
|
||||||
&format!(
|
&format!(
|
||||||
@ -1544,7 +1544,9 @@ fn parse_libs(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if kind == NativeLibKind::StaticNoBundle && !nightly_options::is_nightly_build() {
|
if kind == NativeLibKind::StaticNoBundle
|
||||||
|
&& !nightly_options::match_is_nightly_build(matches)
|
||||||
|
{
|
||||||
early_error(
|
early_error(
|
||||||
error_format,
|
error_format,
|
||||||
"the library kind 'static-nobundle' is only \
|
"the library kind 'static-nobundle' is only \
|
||||||
@ -1833,10 +1835,10 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
|
|||||||
cg,
|
cg,
|
||||||
error_format,
|
error_format,
|
||||||
externs,
|
externs,
|
||||||
|
unstable_features: UnstableFeatures::from_environment(crate_name.as_deref()),
|
||||||
crate_name,
|
crate_name,
|
||||||
alt_std_name: None,
|
alt_std_name: None,
|
||||||
libs,
|
libs,
|
||||||
unstable_features: UnstableFeatures::from_environment(),
|
|
||||||
debug_assertions,
|
debug_assertions,
|
||||||
actually_rustdoc: false,
|
actually_rustdoc: false,
|
||||||
trimmed_def_paths: TrimmedDefPaths::default(),
|
trimmed_def_paths: TrimmedDefPaths::default(),
|
||||||
@ -1957,17 +1959,21 @@ pub mod nightly_options {
|
|||||||
use rustc_feature::UnstableFeatures;
|
use rustc_feature::UnstableFeatures;
|
||||||
|
|
||||||
pub fn is_unstable_enabled(matches: &getopts::Matches) -> bool {
|
pub fn is_unstable_enabled(matches: &getopts::Matches) -> bool {
|
||||||
is_nightly_build() && matches.opt_strs("Z").iter().any(|x| *x == "unstable-options")
|
match_is_nightly_build(matches)
|
||||||
|
&& matches.opt_strs("Z").iter().any(|x| *x == "unstable-options")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_nightly_build() -> bool {
|
pub fn match_is_nightly_build(matches: &getopts::Matches) -> bool {
|
||||||
UnstableFeatures::from_environment().is_nightly_build()
|
is_nightly_build(matches.opt_str("crate-name").as_deref())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_nightly_build(krate: Option<&str>) -> bool {
|
||||||
|
UnstableFeatures::from_environment(krate).is_nightly_build()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn check_nightly_options(matches: &getopts::Matches, flags: &[RustcOptGroup]) {
|
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 has_z_unstable_option = matches.opt_strs("Z").iter().any(|x| *x == "unstable-options");
|
||||||
let really_allows_unstable_options =
|
let really_allows_unstable_options = match_is_nightly_build(matches);
|
||||||
UnstableFeatures::from_environment().is_nightly_build();
|
|
||||||
|
|
||||||
for opt in flags.iter() {
|
for opt in flags.iter() {
|
||||||
if opt.stability == OptionStability::Stable {
|
if opt.stability == OptionStability::Stable {
|
||||||
|
@ -150,7 +150,7 @@ impl ParseSess {
|
|||||||
pub fn with_span_handler(handler: Handler, source_map: Lrc<SourceMap>) -> Self {
|
pub fn with_span_handler(handler: Handler, source_map: Lrc<SourceMap>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
span_diagnostic: handler,
|
span_diagnostic: handler,
|
||||||
unstable_features: UnstableFeatures::from_environment(),
|
unstable_features: UnstableFeatures::from_environment(None),
|
||||||
config: FxHashSet::default(),
|
config: FxHashSet::default(),
|
||||||
edition: ExpnId::root().expn_data().edition,
|
edition: ExpnId::root().expn_data().edition,
|
||||||
raw_identifier_spans: Lock::new(Vec::new()),
|
raw_identifier_spans: Lock::new(Vec::new()),
|
||||||
|
@ -745,6 +745,9 @@ impl Session {
|
|||||||
pub fn unstable_options(&self) -> bool {
|
pub fn unstable_options(&self) -> bool {
|
||||||
self.opts.debugging_opts.unstable_options
|
self.opts.debugging_opts.unstable_options
|
||||||
}
|
}
|
||||||
|
pub fn is_nightly_build(&self) -> bool {
|
||||||
|
self.opts.unstable_features.is_nightly_build()
|
||||||
|
}
|
||||||
pub fn overflow_checks(&self) -> bool {
|
pub fn overflow_checks(&self) -> bool {
|
||||||
self.opts
|
self.opts
|
||||||
.cg
|
.cg
|
||||||
|
@ -12,7 +12,6 @@ use rustc_infer::infer::{self, InferCtxt, InferOk};
|
|||||||
use rustc_middle::ty::fold::{BottomUpFolder, TypeFoldable, TypeFolder, TypeVisitor};
|
use rustc_middle::ty::fold::{BottomUpFolder, TypeFoldable, TypeFolder, TypeVisitor};
|
||||||
use rustc_middle::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef};
|
use rustc_middle::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef};
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||||
use rustc_session::config::nightly_options;
|
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
@ -602,7 +601,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
|||||||
};
|
};
|
||||||
err.span_label(span, label);
|
err.span_label(span, label);
|
||||||
|
|
||||||
if nightly_options::is_nightly_build() {
|
if self.tcx.sess.is_nightly_build() {
|
||||||
err.help("add #![feature(member_constraints)] to the crate attributes to enable");
|
err.help("add #![feature(member_constraints)] to the crate attributes to enable");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,6 @@ use rustc_middle::ty::GenericParamDefKind;
|
|||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, ParamEnvAnd, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness,
|
self, ParamEnvAnd, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness,
|
||||||
};
|
};
|
||||||
use rustc_session::config::nightly_options;
|
|
||||||
use rustc_session::lint;
|
use rustc_session::lint;
|
||||||
use rustc_span::def_id::LocalDefId;
|
use rustc_span::def_id::LocalDefId;
|
||||||
use rustc_span::{symbol::Ident, Span, Symbol, DUMMY_SP};
|
use rustc_span::{symbol::Ident, Span, Symbol, DUMMY_SP};
|
||||||
@ -1272,7 +1271,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
|||||||
self.tcx.def_path_str(stable_pick.item.def_id),
|
self.tcx.def_path_str(stable_pick.item.def_id),
|
||||||
));
|
));
|
||||||
|
|
||||||
if nightly_options::is_nightly_build() {
|
if self.tcx.sess.is_nightly_build() {
|
||||||
for (candidate, feature) in unstable_candidates {
|
for (candidate, feature) in unstable_candidates {
|
||||||
diag.help(&format!(
|
diag.help(&format!(
|
||||||
"add `#![feature({})]` to the crate attributes to enable `{}`",
|
"add `#![feature({})]` to the crate attributes to enable `{}`",
|
||||||
|
@ -681,7 +681,9 @@ impl Attributes {
|
|||||||
}
|
}
|
||||||
Some(&(_, _, ExternalLocation::Remote(ref s))) => s.to_string(),
|
Some(&(_, _, ExternalLocation::Remote(ref s))) => s.to_string(),
|
||||||
Some(&(_, _, ExternalLocation::Unknown)) | None => String::from(
|
Some(&(_, _, ExternalLocation::Unknown)) | None => String::from(
|
||||||
if UnstableFeatures::from_environment().is_nightly_build() {
|
// NOTE: intentionally doesn't pass crate name to avoid having
|
||||||
|
// different primitive links between crates
|
||||||
|
if UnstableFeatures::from_environment(None).is_nightly_build() {
|
||||||
"https://doc.rust-lang.org/nightly"
|
"https://doc.rust-lang.org/nightly"
|
||||||
} else {
|
} else {
|
||||||
"https://doc.rust-lang.org"
|
"https://doc.rust-lang.org"
|
||||||
|
@ -253,6 +253,7 @@ pub struct RenderOptions {
|
|||||||
pub document_private: bool,
|
pub document_private: bool,
|
||||||
/// Document items that have `doc(hidden)`.
|
/// Document items that have `doc(hidden)`.
|
||||||
pub document_hidden: bool,
|
pub document_hidden: bool,
|
||||||
|
pub unstable_features: rustc_feature::UnstableFeatures,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Temporary storage for data obtained during `RustdocVisitor::clean()`.
|
/// Temporary storage for data obtained during `RustdocVisitor::clean()`.
|
||||||
@ -295,7 +296,7 @@ impl Options {
|
|||||||
println_condition(p.condition);
|
println_condition(p.condition);
|
||||||
}
|
}
|
||||||
|
|
||||||
if nightly_options::is_nightly_build() {
|
if nightly_options::match_is_nightly_build(matches) {
|
||||||
println!("\nPasses run with `--show-coverage`:");
|
println!("\nPasses run with `--show-coverage`:");
|
||||||
for p in passes::COVERAGE_PASSES {
|
for p in passes::COVERAGE_PASSES {
|
||||||
print!("{:>20}", p.pass.name);
|
print!("{:>20}", p.pass.name);
|
||||||
@ -479,6 +480,7 @@ impl Options {
|
|||||||
&matches.opt_strs("html-after-content"),
|
&matches.opt_strs("html-after-content"),
|
||||||
&matches.opt_strs("markdown-before-content"),
|
&matches.opt_strs("markdown-before-content"),
|
||||||
&matches.opt_strs("markdown-after-content"),
|
&matches.opt_strs("markdown-after-content"),
|
||||||
|
nightly_options::match_is_nightly_build(&matches),
|
||||||
&diag,
|
&diag,
|
||||||
&mut id_map,
|
&mut id_map,
|
||||||
edition,
|
edition,
|
||||||
@ -535,7 +537,9 @@ impl Options {
|
|||||||
let output_format = match matches.opt_str("output-format") {
|
let output_format = match matches.opt_str("output-format") {
|
||||||
Some(s) => match OutputFormat::try_from(s.as_str()) {
|
Some(s) => match OutputFormat::try_from(s.as_str()) {
|
||||||
Ok(o) => {
|
Ok(o) => {
|
||||||
if o.is_json() && !(show_coverage || nightly_options::is_nightly_build()) {
|
if o.is_json()
|
||||||
|
&& !(show_coverage || nightly_options::match_is_nightly_build(matches))
|
||||||
|
{
|
||||||
diag.struct_err("json output format isn't supported for doc generation")
|
diag.struct_err("json output format isn't supported for doc generation")
|
||||||
.emit();
|
.emit();
|
||||||
return Err(1);
|
return Err(1);
|
||||||
@ -586,7 +590,6 @@ impl Options {
|
|||||||
|
|
||||||
Ok(Options {
|
Ok(Options {
|
||||||
input,
|
input,
|
||||||
crate_name,
|
|
||||||
proc_macro_crate,
|
proc_macro_crate,
|
||||||
error_format,
|
error_format,
|
||||||
libs,
|
libs,
|
||||||
@ -637,7 +640,11 @@ impl Options {
|
|||||||
generate_search_filter,
|
generate_search_filter,
|
||||||
document_private,
|
document_private,
|
||||||
document_hidden,
|
document_hidden,
|
||||||
|
unstable_features: rustc_feature::UnstableFeatures::from_environment(
|
||||||
|
crate_name.as_deref(),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
|
crate_name,
|
||||||
output_format,
|
output_format,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -655,7 +662,8 @@ fn check_deprecated_options(matches: &getopts::Matches, diag: &rustc_errors::Han
|
|||||||
for flag in deprecated_flags.iter() {
|
for flag in deprecated_flags.iter() {
|
||||||
if matches.opt_present(flag) {
|
if matches.opt_present(flag) {
|
||||||
if *flag == "output-format"
|
if *flag == "output-format"
|
||||||
&& (matches.opt_present("show-coverage") || nightly_options::is_nightly_build())
|
&& (matches.opt_present("show-coverage")
|
||||||
|
|| nightly_options::match_is_nightly_build(matches))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -370,7 +370,7 @@ pub fn run_core(
|
|||||||
cg: codegen_options,
|
cg: codegen_options,
|
||||||
externs,
|
externs,
|
||||||
target_triple: target,
|
target_triple: target,
|
||||||
unstable_features: UnstableFeatures::from_environment(),
|
unstable_features: UnstableFeatures::from_environment(crate_name.as_deref()),
|
||||||
actually_rustdoc: true,
|
actually_rustdoc: true,
|
||||||
debugging_opts,
|
debugging_opts,
|
||||||
error_format,
|
error_format,
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_errors::ErrorReported;
|
use rustc_errors::ErrorReported;
|
||||||
use rustc_feature::UnstableFeatures;
|
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::intravisit;
|
use rustc_hir::intravisit;
|
||||||
use rustc_hir::{HirId, CRATE_HIR_ID};
|
use rustc_hir::{HirId, CRATE_HIR_ID};
|
||||||
@ -70,7 +69,7 @@ pub fn run(options: Options) -> Result<(), ErrorReported> {
|
|||||||
lint_cap: Some(options.lint_cap.clone().unwrap_or_else(|| lint::Forbid)),
|
lint_cap: Some(options.lint_cap.clone().unwrap_or_else(|| lint::Forbid)),
|
||||||
cg: options.codegen_options.clone(),
|
cg: options.codegen_options.clone(),
|
||||||
externs: options.externs.clone(),
|
externs: options.externs.clone(),
|
||||||
unstable_features: UnstableFeatures::from_environment(),
|
unstable_features: options.render_options.unstable_features,
|
||||||
actually_rustdoc: true,
|
actually_rustdoc: true,
|
||||||
debugging_opts: config::DebuggingOptions { ..config::basic_debugging_options() },
|
debugging_opts: config::DebuggingOptions { ..config::basic_debugging_options() },
|
||||||
edition: options.edition,
|
edition: options.edition,
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
use crate::html::markdown::{ErrorCodes, IdMap, Markdown, Playground};
|
use crate::html::markdown::{ErrorCodes, IdMap, Markdown, Playground};
|
||||||
use crate::rustc_span::edition::Edition;
|
use crate::rustc_span::edition::Edition;
|
||||||
use rustc_feature::UnstableFeatures;
|
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::str;
|
use std::str;
|
||||||
@ -25,12 +24,13 @@ impl ExternalHtml {
|
|||||||
after_content: &[String],
|
after_content: &[String],
|
||||||
md_before_content: &[String],
|
md_before_content: &[String],
|
||||||
md_after_content: &[String],
|
md_after_content: &[String],
|
||||||
|
nightly_build: bool,
|
||||||
diag: &rustc_errors::Handler,
|
diag: &rustc_errors::Handler,
|
||||||
id_map: &mut IdMap,
|
id_map: &mut IdMap,
|
||||||
edition: Edition,
|
edition: Edition,
|
||||||
playground: &Option<Playground>,
|
playground: &Option<Playground>,
|
||||||
) -> Option<ExternalHtml> {
|
) -> Option<ExternalHtml> {
|
||||||
let codes = ErrorCodes::from(UnstableFeatures::from_environment().is_nightly_build());
|
let codes = ErrorCodes::from(nightly_build);
|
||||||
let ih = load_external_files(in_header, diag)?;
|
let ih = load_external_files(in_header, diag)?;
|
||||||
let bc = load_external_files(before_content, diag)?;
|
let bc = load_external_files(before_content, diag)?;
|
||||||
let m_bc = load_external_files(md_before_content, diag)?;
|
let m_bc = load_external_files(md_before_content, diag)?;
|
||||||
|
@ -52,7 +52,6 @@ use rustc_ast_pretty::pprust;
|
|||||||
use rustc_attr::StabilityLevel;
|
use rustc_attr::StabilityLevel;
|
||||||
use rustc_data_structures::flock;
|
use rustc_data_structures::flock;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_feature::UnstableFeatures;
|
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LOCAL_CRATE};
|
use rustc_hir::def_id::{DefId, LOCAL_CRATE};
|
||||||
use rustc_hir::Mutability;
|
use rustc_hir::Mutability;
|
||||||
@ -397,6 +396,7 @@ impl FormatRenderer for Context {
|
|||||||
resource_suffix,
|
resource_suffix,
|
||||||
static_root_path,
|
static_root_path,
|
||||||
generate_search_filter,
|
generate_search_filter,
|
||||||
|
unstable_features,
|
||||||
..
|
..
|
||||||
} = options;
|
} = options;
|
||||||
|
|
||||||
@ -466,7 +466,7 @@ impl FormatRenderer for Context {
|
|||||||
static_root_path,
|
static_root_path,
|
||||||
fs: DocFS::new(sender),
|
fs: DocFS::new(sender),
|
||||||
edition,
|
edition,
|
||||||
codes: ErrorCodes::from(UnstableFeatures::from_environment().is_nightly_build()),
|
codes: ErrorCodes::from(unstable_features.is_nightly_build()),
|
||||||
playground,
|
playground,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@ use std::fs::{create_dir_all, read_to_string, File};
|
|||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use rustc_feature::UnstableFeatures;
|
|
||||||
use rustc_span::edition::Edition;
|
use rustc_span::edition::Edition;
|
||||||
use rustc_span::source_map::DUMMY_SP;
|
use rustc_span::source_map::DUMMY_SP;
|
||||||
|
|
||||||
@ -66,7 +65,7 @@ pub fn render<P: AsRef<Path>>(
|
|||||||
let title = metadata[0];
|
let title = metadata[0];
|
||||||
|
|
||||||
let mut ids = IdMap::new();
|
let mut ids = IdMap::new();
|
||||||
let error_codes = ErrorCodes::from(UnstableFeatures::from_environment().is_nightly_build());
|
let error_codes = ErrorCodes::from(options.unstable_features.is_nightly_build());
|
||||||
let text = if !options.markdown_no_toc {
|
let text = if !options.markdown_no_toc {
|
||||||
MarkdownWithToc(text, &mut ids, error_codes, edition, &playground).into_string()
|
MarkdownWithToc(text, &mut ids, error_codes, edition, &playground).into_string()
|
||||||
} else {
|
} else {
|
||||||
@ -131,7 +130,7 @@ pub fn test(mut options: Options) -> Result<(), String> {
|
|||||||
options.enable_per_target_ignores,
|
options.enable_per_target_ignores,
|
||||||
);
|
);
|
||||||
collector.set_position(DUMMY_SP);
|
collector.set_position(DUMMY_SP);
|
||||||
let codes = ErrorCodes::from(UnstableFeatures::from_environment().is_nightly_build());
|
let codes = ErrorCodes::from(options.render_options.unstable_features.is_nightly_build());
|
||||||
|
|
||||||
find_testable_code(&input_str, &mut collector, codes, options.enable_per_target_ignores, None);
|
find_testable_code(&input_str, &mut collector, codes, options.enable_per_target_ignores, None);
|
||||||
|
|
||||||
|
@ -92,9 +92,7 @@ pub fn look_for_tests<'tcx>(cx: &DocContext<'tcx>, dox: &str, item: &Item) {
|
|||||||
|
|
||||||
find_testable_code(&dox, &mut tests, ErrorCodes::No, false, None);
|
find_testable_code(&dox, &mut tests, ErrorCodes::No, false, None);
|
||||||
|
|
||||||
if tests.found_tests == 0
|
if tests.found_tests == 0 && cx.tcx.sess.is_nightly_build() {
|
||||||
&& rustc_feature::UnstableFeatures::from_environment().is_nightly_build()
|
|
||||||
{
|
|
||||||
if should_have_doc_example(cx, &item) {
|
if should_have_doc_example(cx, &item) {
|
||||||
debug!("reporting error for {:?} (hir_id={:?})", item, hir_id);
|
debug!("reporting error for {:?} (hir_id={:?})", item, hir_id);
|
||||||
let sp = span_of_attrs(&item.attrs).unwrap_or(item.source.span());
|
let sp = span_of_attrs(&item.attrs).unwrap_or(item.source.span());
|
||||||
|
@ -5,7 +5,6 @@ use crate::fold::DocFolder;
|
|||||||
use crate::html::markdown::opts;
|
use crate::html::markdown::opts;
|
||||||
use core::ops::Range;
|
use core::ops::Range;
|
||||||
use pulldown_cmark::{Event, Parser};
|
use pulldown_cmark::{Event, Parser};
|
||||||
use rustc_feature::UnstableFeatures;
|
|
||||||
use rustc_session::lint;
|
use rustc_session::lint;
|
||||||
use std::iter::Peekable;
|
use std::iter::Peekable;
|
||||||
use std::str::CharIndices;
|
use std::str::CharIndices;
|
||||||
@ -27,7 +26,7 @@ impl<'a, 'tcx> InvalidHtmlTagsLinter<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn check_invalid_html_tags(krate: Crate, cx: &DocContext<'_>) -> Crate {
|
pub fn check_invalid_html_tags(krate: Crate, cx: &DocContext<'_>) -> Crate {
|
||||||
if !UnstableFeatures::from_environment().is_nightly_build() {
|
if !cx.tcx.sess.is_nightly_build() {
|
||||||
krate
|
krate
|
||||||
} else {
|
} else {
|
||||||
let mut coll = InvalidHtmlTagsLinter::new(cx);
|
let mut coll = InvalidHtmlTagsLinter::new(cx);
|
||||||
|
@ -7,7 +7,6 @@ use core::ops::Range;
|
|||||||
use pulldown_cmark::{Event, LinkType, Parser, Tag};
|
use pulldown_cmark::{Event, LinkType, Parser, Tag};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_feature::UnstableFeatures;
|
|
||||||
use rustc_session::lint;
|
use rustc_session::lint;
|
||||||
|
|
||||||
pub const CHECK_NON_AUTOLINKS: Pass = Pass {
|
pub const CHECK_NON_AUTOLINKS: Pass = Pass {
|
||||||
@ -54,7 +53,7 @@ impl<'a, 'tcx> NonAutolinksLinter<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn check_non_autolinks(krate: Crate, cx: &DocContext<'_>) -> Crate {
|
pub fn check_non_autolinks(krate: Crate, cx: &DocContext<'_>) -> Crate {
|
||||||
if !UnstableFeatures::from_environment().is_nightly_build() {
|
if !cx.tcx.sess.is_nightly_build() {
|
||||||
krate
|
krate
|
||||||
} else {
|
} else {
|
||||||
let mut coll = NonAutolinksLinter::new(cx);
|
let mut coll = NonAutolinksLinter::new(cx);
|
||||||
|
Loading…
Reference in New Issue
Block a user