1
Fork 0

Auto merge of #107870 - matthiaskrgr:rollup-3z1q4rm, r=matthiaskrgr

Rollup of 6 pull requests

Successful merges:

 - #107043 (Support `true` and `false` as boolean flag params)
 - #107831 (Query refactoring)
 - #107841 (Handled snap curl issue inside Rust)
 - #107852 (rustdoc: remove unused fn parameter `tab`)
 - #107861 (Sync release notes for 1.67.1)
 - #107863 (Allow multiple candidates with same response in new solver)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
This commit is contained in:
bors 2023-02-10 06:20:01 +00:00
commit 9b8dbd558c
26 changed files with 112 additions and 120 deletions

View file

@ -4773,6 +4773,7 @@ checksum = "8ba09476327c4b70ccefb6180f046ef588c26a24cf5d269a9feba316eb4f029f"
name = "rustc_trait_selection" name = "rustc_trait_selection"
version = "0.0.0" version = "0.0.0"
dependencies = [ dependencies = [
"itertools",
"rustc_ast", "rustc_ast",
"rustc_attr", "rustc_attr",
"rustc_data_structures", "rustc_data_structures",

View file

@ -1,3 +1,10 @@
Version 1.67.1 (2023-02-09)
===========================
- [Fix interoperability with thin archives.](https://github.com/rust-lang/rust/pull/107360)
- [Fix an internal error in the compiler build process.](https://github.com/rust-lang/rust/pull/105624)
- [Downgrade `clippy::uninlined_format_args` to pedantic.](https://github.com/rust-lang/rust-clippy/pull/10265)
Version 1.67.0 (2023-01-26) Version 1.67.0 (2023-01-26)
========================== ==========================

View file

@ -54,7 +54,7 @@ fn eval_body_using_ecx<'mir, 'tcx>(
trace!( trace!(
"eval_body_using_ecx: pushing stack frame for global: {}{}", "eval_body_using_ecx: pushing stack frame for global: {}{}",
with_no_trimmed_paths!(ty::tls::with(|tcx| tcx.def_path_str(cid.instance.def_id()))), with_no_trimmed_paths!(ecx.tcx.def_path_str(cid.instance.def_id())),
cid.promoted.map_or_else(String::new, |p| format!("::promoted[{:?}]", p)) cid.promoted.map_or_else(String::new, |p| format!("::promoted[{:?}]", p))
); );

View file

@ -203,12 +203,10 @@ impl CanonicalizeMode for CanonicalizeQueryResponse {
// rust-lang/rust#57464: `impl Trait` can leak local // rust-lang/rust#57464: `impl Trait` can leak local
// scopes (in manner violating typeck). Therefore, use // scopes (in manner violating typeck). Therefore, use
// `delay_span_bug` to allow type error over an ICE. // `delay_span_bug` to allow type error over an ICE.
ty::tls::with(|tcx| { canonicalizer.tcx.sess.delay_span_bug(
tcx.sess.delay_span_bug( rustc_span::DUMMY_SP,
rustc_span::DUMMY_SP, &format!("unexpected region in query response: `{:?}`", r),
&format!("unexpected region in query response: `{:?}`", r), );
);
});
r r
} }
} }

View file

@ -38,7 +38,7 @@ fn track_diagnostic(diagnostic: &mut Diagnostic, f: &mut dyn FnMut(&mut Diagnost
// Diagnostics are tracked, we can ignore the dependency. // Diagnostics are tracked, we can ignore the dependency.
let icx = tls::ImplicitCtxt { task_deps: TaskDepsRef::Ignore, ..icx.clone() }; let icx = tls::ImplicitCtxt { task_deps: TaskDepsRef::Ignore, ..icx.clone() };
return tls::enter_context(&icx, move |_| (*f)(diagnostic)); return tls::enter_context(&icx, move || (*f)(diagnostic));
} }
// In any other case, invoke diagnostics anyway. // In any other case, invoke diagnostics anyway.

View file

@ -738,30 +738,16 @@ pub static DEFAULT_EXTERN_QUERY_PROVIDERS: LazyLock<ExternProviders> = LazyLock:
extern_providers extern_providers
}); });
pub struct QueryContext<'tcx> {
gcx: &'tcx GlobalCtxt<'tcx>,
}
impl<'tcx> QueryContext<'tcx> {
pub fn enter<F, R>(&mut self, f: F) -> R
where
F: FnOnce(TyCtxt<'tcx>) -> R,
{
let icx = ty::tls::ImplicitCtxt::new(self.gcx);
ty::tls::enter_context(&icx, |_| f(icx.tcx))
}
}
pub fn create_global_ctxt<'tcx>( pub fn create_global_ctxt<'tcx>(
compiler: &'tcx Compiler, compiler: &'tcx Compiler,
lint_store: Lrc<LintStore>, lint_store: Lrc<LintStore>,
dep_graph: DepGraph, dep_graph: DepGraph,
untracked: Untracked, untracked: Untracked,
queries: &'tcx OnceCell<TcxQueries<'tcx>>, queries: &'tcx OnceCell<TcxQueries<'tcx>>,
global_ctxt: &'tcx OnceCell<GlobalCtxt<'tcx>>, gcx_cell: &'tcx OnceCell<GlobalCtxt<'tcx>>,
arena: &'tcx WorkerLocal<Arena<'tcx>>, arena: &'tcx WorkerLocal<Arena<'tcx>>,
hir_arena: &'tcx WorkerLocal<rustc_hir::Arena<'tcx>>, hir_arena: &'tcx WorkerLocal<rustc_hir::Arena<'tcx>>,
) -> QueryContext<'tcx> { ) -> &'tcx GlobalCtxt<'tcx> {
// We're constructing the HIR here; we don't care what we will // We're constructing the HIR here; we don't care what we will
// read, since we haven't even constructed the *input* to // read, since we haven't even constructed the *input* to
// incr. comp. yet. // incr. comp. yet.
@ -785,8 +771,8 @@ pub fn create_global_ctxt<'tcx>(
TcxQueries::new(local_providers, extern_providers, query_result_on_disk_cache) TcxQueries::new(local_providers, extern_providers, query_result_on_disk_cache)
}); });
let gcx = sess.time("setup_global_ctxt", || { sess.time("setup_global_ctxt", || {
global_ctxt.get_or_init(move || { gcx_cell.get_or_init(move || {
TyCtxt::create_global_ctxt( TyCtxt::create_global_ctxt(
sess, sess,
lint_store, lint_store,
@ -799,9 +785,7 @@ pub fn create_global_ctxt<'tcx>(
rustc_query_impl::query_callbacks(arena), rustc_query_impl::query_callbacks(arena),
) )
}) })
}); })
QueryContext { gcx }
} }
/// Runs the resolution, type-checking, region checking and other /// Runs the resolution, type-checking, region checking and other

View file

@ -1,6 +1,6 @@
use crate::errors::{FailedWritingFile, RustcErrorFatal, RustcErrorUnexpectedAnnotation}; use crate::errors::{FailedWritingFile, RustcErrorFatal, RustcErrorUnexpectedAnnotation};
use crate::interface::{Compiler, Result}; use crate::interface::{Compiler, Result};
use crate::passes::{self, BoxedResolver, QueryContext}; use crate::passes::{self, BoxedResolver};
use rustc_ast as ast; use rustc_ast as ast;
use rustc_codegen_ssa::traits::CodegenBackend; use rustc_codegen_ssa::traits::CodegenBackend;
@ -64,7 +64,7 @@ impl<'a, T> std::ops::DerefMut for QueryResult<'a, T> {
} }
} }
impl<'a, 'tcx> QueryResult<'a, QueryContext<'tcx>> { impl<'a, 'tcx> QueryResult<'a, &'tcx GlobalCtxt<'tcx>> {
pub fn enter<T>(&mut self, f: impl FnOnce(TyCtxt<'tcx>) -> T) -> T { pub fn enter<T>(&mut self, f: impl FnOnce(TyCtxt<'tcx>) -> T) -> T {
(*self.0).get_mut().enter(f) (*self.0).get_mut().enter(f)
} }
@ -78,7 +78,7 @@ impl<T> Default for Query<T> {
pub struct Queries<'tcx> { pub struct Queries<'tcx> {
compiler: &'tcx Compiler, compiler: &'tcx Compiler,
gcx: OnceCell<GlobalCtxt<'tcx>>, gcx_cell: OnceCell<GlobalCtxt<'tcx>>,
queries: OnceCell<TcxQueries<'tcx>>, queries: OnceCell<TcxQueries<'tcx>>,
arena: WorkerLocal<Arena<'tcx>>, arena: WorkerLocal<Arena<'tcx>>,
@ -90,7 +90,8 @@ pub struct Queries<'tcx> {
register_plugins: Query<(ast::Crate, Lrc<LintStore>)>, register_plugins: Query<(ast::Crate, Lrc<LintStore>)>,
expansion: Query<(Lrc<ast::Crate>, Rc<RefCell<BoxedResolver>>, Lrc<LintStore>)>, expansion: Query<(Lrc<ast::Crate>, Rc<RefCell<BoxedResolver>>, Lrc<LintStore>)>,
dep_graph: Query<DepGraph>, dep_graph: Query<DepGraph>,
global_ctxt: Query<QueryContext<'tcx>>, // This just points to what's in `gcx_cell`.
gcx: Query<&'tcx GlobalCtxt<'tcx>>,
ongoing_codegen: Query<Box<dyn Any>>, ongoing_codegen: Query<Box<dyn Any>>,
} }
@ -98,7 +99,7 @@ impl<'tcx> Queries<'tcx> {
pub fn new(compiler: &'tcx Compiler) -> Queries<'tcx> { pub fn new(compiler: &'tcx Compiler) -> Queries<'tcx> {
Queries { Queries {
compiler, compiler,
gcx: OnceCell::new(), gcx_cell: OnceCell::new(),
queries: OnceCell::new(), queries: OnceCell::new(),
arena: WorkerLocal::new(|_| Arena::default()), arena: WorkerLocal::new(|_| Arena::default()),
hir_arena: WorkerLocal::new(|_| rustc_hir::Arena::default()), hir_arena: WorkerLocal::new(|_| rustc_hir::Arena::default()),
@ -108,7 +109,7 @@ impl<'tcx> Queries<'tcx> {
register_plugins: Default::default(), register_plugins: Default::default(),
expansion: Default::default(), expansion: Default::default(),
dep_graph: Default::default(), dep_graph: Default::default(),
global_ctxt: Default::default(), gcx: Default::default(),
ongoing_codegen: Default::default(), ongoing_codegen: Default::default(),
} }
} }
@ -207,8 +208,8 @@ impl<'tcx> Queries<'tcx> {
}) })
} }
pub fn global_ctxt(&'tcx self) -> Result<QueryResult<'_, QueryContext<'tcx>>> { pub fn global_ctxt(&'tcx self) -> Result<QueryResult<'_, &'tcx GlobalCtxt<'tcx>>> {
self.global_ctxt.compute(|| { self.gcx.compute(|| {
let crate_name = *self.crate_name()?.borrow(); let crate_name = *self.crate_name()?.borrow();
let (krate, resolver, lint_store) = self.expansion()?.steal(); let (krate, resolver, lint_store) = self.expansion()?.steal();
@ -218,18 +219,18 @@ impl<'tcx> Queries<'tcx> {
ast_lowering: untracked_resolver_for_lowering, ast_lowering: untracked_resolver_for_lowering,
} = BoxedResolver::to_resolver_outputs(resolver); } = BoxedResolver::to_resolver_outputs(resolver);
let mut qcx = passes::create_global_ctxt( let gcx = passes::create_global_ctxt(
self.compiler, self.compiler,
lint_store, lint_store,
self.dep_graph()?.steal(), self.dep_graph()?.steal(),
untracked, untracked,
&self.queries, &self.queries,
&self.gcx, &self.gcx_cell,
&self.arena, &self.arena,
&self.hir_arena, &self.hir_arena,
); );
qcx.enter(|tcx| { gcx.enter(|tcx| {
let feed = tcx.feed_unit_query(); let feed = tcx.feed_unit_query();
feed.resolver_for_lowering( feed.resolver_for_lowering(
tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, krate))), tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, krate))),
@ -239,7 +240,7 @@ impl<'tcx> Queries<'tcx> {
let feed = tcx.feed_local_crate(); let feed = tcx.feed_local_crate();
feed.crate_name(crate_name); feed.crate_name(crate_name);
}); });
Ok(qcx) Ok(gcx)
}) })
} }
@ -387,7 +388,7 @@ impl Compiler {
// NOTE: intentionally does not compute the global context if it hasn't been built yet, // NOTE: intentionally does not compute the global context if it hasn't been built yet,
// since that likely means there was a parse error. // since that likely means there was a parse error.
if let Some(Ok(gcx)) = &mut *queries.global_ctxt.result.borrow_mut() { if let Some(Ok(gcx)) = &mut *queries.gcx.result.borrow_mut() {
let gcx = gcx.get_mut(); let gcx = gcx.get_mut();
// We assume that no queries are run past here. If there are new queries // We assume that no queries are run past here. If there are new queries
// after this point, they'll show up as "<unknown>" in self-profiling data. // after this point, they'll show up as "<unknown>" in self-profiling data.

View file

@ -55,7 +55,7 @@ impl rustc_query_system::dep_graph::DepKind for DepKind {
ty::tls::with_context(|icx| { ty::tls::with_context(|icx| {
let icx = ty::tls::ImplicitCtxt { task_deps, ..icx.clone() }; let icx = ty::tls::ImplicitCtxt { task_deps, ..icx.clone() };
ty::tls::enter_context(&icx, |_| op()) ty::tls::enter_context(&icx, op)
}) })
} }

View file

@ -34,6 +34,7 @@
#![feature(get_mut_unchecked)] #![feature(get_mut_unchecked)]
#![feature(if_let_guard)] #![feature(if_let_guard)]
#![feature(iter_from_generator)] #![feature(iter_from_generator)]
#![feature(local_key_cell_methods)]
#![feature(negative_impls)] #![feature(negative_impls)]
#![feature(never_type)] #![feature(never_type)]
#![feature(extern_types)] #![feature(extern_types)]

View file

@ -468,6 +468,18 @@ pub struct GlobalCtxt<'tcx> {
pub(crate) alloc_map: Lock<interpret::AllocMap<'tcx>>, pub(crate) alloc_map: Lock<interpret::AllocMap<'tcx>>,
} }
impl<'tcx> GlobalCtxt<'tcx> {
/// Installs `self` in a `TyCtxt` and `ImplicitCtxt` for the duration of
/// `f`.
pub fn enter<'a: 'tcx, F, R>(&'a self, f: F) -> R
where
F: FnOnce(TyCtxt<'tcx>) -> R,
{
let icx = tls::ImplicitCtxt::new(self);
tls::enter_context(&icx, || f(icx.tcx))
}
}
impl<'tcx> TyCtxt<'tcx> { impl<'tcx> TyCtxt<'tcx> {
/// Expects a body and returns its codegen attributes. /// Expects a body and returns its codegen attributes.
/// ///

View file

@ -89,9 +89,8 @@ mod tlv {
/// This is used to set the pointer to the new `ImplicitCtxt`. /// This is used to set the pointer to the new `ImplicitCtxt`.
#[inline] #[inline]
pub(super) fn with_tlv<F: FnOnce() -> R, R>(value: *const (), f: F) -> R { pub(super) fn with_tlv<F: FnOnce() -> R, R>(value: *const (), f: F) -> R {
let old = get_tlv(); let old = TLV.replace(value);
let _reset = rustc_data_structures::OnDrop(move || TLV.with(|tlv| tlv.set(old))); let _reset = rustc_data_structures::OnDrop(move || TLV.set(old));
TLV.with(|tlv| tlv.set(value));
f() f()
} }
} }
@ -110,9 +109,9 @@ unsafe fn downcast<'a, 'tcx>(context: *const ()) -> &'a ImplicitCtxt<'a, 'tcx> {
#[inline] #[inline]
pub fn enter_context<'a, 'tcx, F, R>(context: &ImplicitCtxt<'a, 'tcx>, f: F) -> R pub fn enter_context<'a, 'tcx, F, R>(context: &ImplicitCtxt<'a, 'tcx>, f: F) -> R
where where
F: FnOnce(&ImplicitCtxt<'a, 'tcx>) -> R, F: FnOnce() -> R,
{ {
tlv::with_tlv(erase(context), || f(&context)) tlv::with_tlv(erase(context), f)
} }
/// Allows access to the current `ImplicitCtxt` in a closure if one is available. /// Allows access to the current `ImplicitCtxt` in a closure if one is available.

View file

@ -124,7 +124,7 @@ impl QueryContext for QueryCtxt<'_> {
}; };
// Use the `ImplicitCtxt` while we execute the query. // Use the `ImplicitCtxt` while we execute the query.
tls::enter_context(&new_icx, |_| { tls::enter_context(&new_icx, || {
rustc_data_structures::stack::ensure_sufficient_stack(compute) rustc_data_structures::stack::ensure_sufficient_stack(compute)
}) })
}) })

View file

@ -349,7 +349,7 @@ fn build_options<O: Default>(
#[allow(non_upper_case_globals)] #[allow(non_upper_case_globals)]
mod desc { mod desc {
pub const parse_no_flag: &str = "no value"; pub const parse_no_flag: &str = "no value";
pub const parse_bool: &str = "one of: `y`, `yes`, `on`, `n`, `no`, or `off`"; pub const parse_bool: &str = "one of: `y`, `yes`, `on`, `true`, `n`, `no`, `off` or `false`";
pub const parse_opt_bool: &str = parse_bool; pub const parse_opt_bool: &str = parse_bool;
pub const parse_string: &str = "a string"; pub const parse_string: &str = "a string";
pub const parse_opt_string: &str = parse_string; pub const parse_opt_string: &str = parse_string;
@ -433,11 +433,11 @@ mod parse {
/// Use this for any boolean option that has a static default. /// Use this for any boolean option that has a static default.
pub(crate) fn parse_bool(slot: &mut bool, v: Option<&str>) -> bool { pub(crate) fn parse_bool(slot: &mut bool, v: Option<&str>) -> bool {
match v { match v {
Some("y") | Some("yes") | Some("on") | None => { Some("y") | Some("yes") | Some("on") | Some("true") | None => {
*slot = true; *slot = true;
true true
} }
Some("n") | Some("no") | Some("off") => { Some("n") | Some("no") | Some("off") | Some("false") => {
*slot = false; *slot = false;
true true
} }
@ -450,11 +450,11 @@ mod parse {
/// other factors, such as other options, or target options.) /// other factors, such as other options, or target options.)
pub(crate) fn parse_opt_bool(slot: &mut Option<bool>, v: Option<&str>) -> bool { pub(crate) fn parse_opt_bool(slot: &mut Option<bool>, v: Option<&str>) -> bool {
match v { match v {
Some("y") | Some("yes") | Some("on") | None => { Some("y") | Some("yes") | Some("on") | Some("true") | None => {
*slot = Some(true); *slot = Some(true);
true true
} }
Some("n") | Some("no") | Some("off") => { Some("n") | Some("no") | Some("off") | Some("false") => {
*slot = Some(false); *slot = Some(false);
true true
} }

View file

@ -24,3 +24,4 @@ rustc_span = { path = "../rustc_span" }
rustc_target = { path = "../rustc_target" } rustc_target = { path = "../rustc_target" }
rustc_transmute = { path = "../rustc_transmute", features = ["rustc"] } rustc_transmute = { path = "../rustc_transmute", features = ["rustc"] }
smallvec = { version = "1.8.1", features = ["union", "may_dangle"] } smallvec = { version = "1.8.1", features = ["union", "may_dangle"] }
itertools = "0.10.1"

View file

@ -4,6 +4,7 @@ use super::infcx_ext::InferCtxtExt;
#[cfg(doc)] #[cfg(doc)]
use super::trait_goals::structural_traits::*; use super::trait_goals::structural_traits::*;
use super::{CanonicalResponse, Certainty, EvalCtxt, Goal, MaybeCause, QueryResult}; use super::{CanonicalResponse, Certainty, EvalCtxt, Goal, MaybeCause, QueryResult};
use itertools::Itertools;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_infer::traits::query::NoSolution; use rustc_infer::traits::query::NoSolution;
use rustc_infer::traits::util::elaborate_predicates; use rustc_infer::traits::util::elaborate_predicates;
@ -489,9 +490,9 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
i += 1; i += 1;
} }
// If there are *STILL* multiple candidates, give up // If there are *STILL* multiple candidates that have *different* response
// and report ambiguity. // results, give up and report ambiguity.
if candidates.len() > 1 { if candidates.len() > 1 && !candidates.iter().map(|cand| cand.result).all_equal() {
let certainty = if candidates.iter().all(|x| { let certainty = if candidates.iter().all(|x| {
matches!(x.result.value.certainty, Certainty::Maybe(MaybeCause::Overflow)) matches!(x.result.value.certainty, Certainty::Maybe(MaybeCause::Overflow))
}) { }) {
@ -503,6 +504,7 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
} }
} }
// FIXME: What if there are >1 candidates left with the same response, and one is a reservation impl?
Ok(self.discard_reservation_impl(candidates.pop().unwrap()).result) Ok(self.discard_reservation_impl(candidates.pop().unwrap()).result)
} }

View file

@ -98,6 +98,7 @@ impl<'tcx, 'a> GeneratorData<'tcx, 'a> {
// obligation // obligation
fn get_from_await_ty<F>( fn get_from_await_ty<F>(
&self, &self,
tcx: TyCtxt<'tcx>,
visitor: AwaitsVisitor, visitor: AwaitsVisitor,
hir: map::Map<'tcx>, hir: map::Map<'tcx>,
ty_matches: F, ty_matches: F,
@ -134,9 +135,7 @@ impl<'tcx, 'a> GeneratorData<'tcx, 'a> {
.unwrap_or_else(|| { .unwrap_or_else(|| {
bug!( bug!(
"node_type: no type for node {}", "node_type: no type for node {}",
ty::tls::with(|tcx| tcx tcx.hir().node_to_string(await_expr.hir_id)
.hir()
.node_to_string(await_expr.hir_id))
) )
}) })
}, },
@ -2351,7 +2350,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
let mut interior_or_upvar_span = None; let mut interior_or_upvar_span = None;
let from_awaited_ty = generator_data.get_from_await_ty(visitor, hir, ty_matches); let from_awaited_ty = generator_data.get_from_await_ty(self.tcx, visitor, hir, ty_matches);
debug!(?from_awaited_ty); debug!(?from_awaited_ty);
// The generator interior types share the same binders // The generator interior types share the same binders

View file

@ -229,10 +229,10 @@ impl Config {
"--retry", "--retry",
"3", "3",
"-Sf", "-Sf",
"-o",
]); ]);
curl.arg(tempfile);
curl.arg(url); curl.arg(url);
let f = File::create(tempfile).unwrap();
curl.stdout(Stdio::from(f));
if !self.check_run(&mut curl) { if !self.check_run(&mut curl) {
if self.build.contains("windows-msvc") { if self.build.contains("windows-msvc") {
println!("Fallback to PowerShell"); println!("Fallback to PowerShell");

View file

@ -49,10 +49,10 @@ Guard](https://docs.microsoft.com/en-us/windows/win32/secbp/control-flow-guard)
platform security feature. This flag is currently ignored for non-Windows targets. platform security feature. This flag is currently ignored for non-Windows targets.
It takes one of the following values: It takes one of the following values:
* `y`, `yes`, `on`, `checks`, or no value: enable Control Flow Guard. * `y`, `yes`, `on`, `true`, `checks`, or no value: enable Control Flow Guard.
* `nochecks`: emit Control Flow Guard metadata without runtime enforcement checks (this * `nochecks`: emit Control Flow Guard metadata without runtime enforcement checks (this
should only be used for testing purposes as it does not provide security enforcement). should only be used for testing purposes as it does not provide security enforcement).
* `n`, `no`, `off`: do not enable Control Flow Guard (the default). * `n`, `no`, `off`, `false`: do not enable Control Flow Guard (the default).
## debug-assertions ## debug-assertions
@ -60,8 +60,8 @@ This flag lets you turn `cfg(debug_assertions)` [conditional
compilation](../../reference/conditional-compilation.md#debug_assertions) on compilation](../../reference/conditional-compilation.md#debug_assertions) on
or off. It takes one of the following values: or off. It takes one of the following values:
* `y`, `yes`, `on`, or no value: enable debug-assertions. * `y`, `yes`, `on`, `true`, or no value: enable debug-assertions.
* `n`, `no`, or `off`: disable debug-assertions. * `n`, `no`, `off` or `false`: disable debug-assertions.
If not specified, debug assertions are automatically enabled only if the If not specified, debug assertions are automatically enabled only if the
[opt-level](#opt-level) is 0. [opt-level](#opt-level) is 0.
@ -82,8 +82,8 @@ Note: The [`-g` flag][option-g-debug] is an alias for `-C debuginfo=2`.
This flag controls whether or not the linker includes its default libraries. This flag controls whether or not the linker includes its default libraries.
It takes one of the following values: It takes one of the following values:
* `y`, `yes`, `on`, or no value: include default libraries (the default). * `y`, `yes`, `on`, `true` or no value: include default libraries (the default).
* `n`, `no`, or `off`: exclude default libraries. * `n`, `no`, `off` or `false`: exclude default libraries.
For example, for gcc flavor linkers, this issues the `-nodefaultlibs` flag to For example, for gcc flavor linkers, this issues the `-nodefaultlibs` flag to
the linker. the linker.
@ -93,8 +93,8 @@ the linker.
This flag controls whether or not the compiler embeds LLVM bitcode into object This flag controls whether or not the compiler embeds LLVM bitcode into object
files. It takes one of the following values: files. It takes one of the following values:
* `y`, `yes`, `on`, or no value: put bitcode in rlibs (the default). * `y`, `yes`, `on`, `true` or no value: put bitcode in rlibs (the default).
* `n`, `no`, or `off`: omit bitcode from rlibs. * `n`, `no`, `off` or `false`: omit bitcode from rlibs.
LLVM bitcode is required when rustc is performing link-time optimization (LTO). LLVM bitcode is required when rustc is performing link-time optimization (LTO).
It is also required on some targets like iOS ones where vendors look for LLVM It is also required on some targets like iOS ones where vendors look for LLVM
@ -135,8 +135,8 @@ flag][option-emit] for more information.
This flag forces the use of frame pointers. It takes one of the following This flag forces the use of frame pointers. It takes one of the following
values: values:
* `y`, `yes`, `on`, or no value: force-enable frame pointers. * `y`, `yes`, `on`, `true` or no value: force-enable frame pointers.
* `n`, `no`, or `off`: do not force-enable frame pointers. This does * `n`, `no`, `off` or `false`: do not force-enable frame pointers. This does
not necessarily mean frame pointers will be removed. not necessarily mean frame pointers will be removed.
The default behaviour, if frame pointers are not force-enabled, depends on the The default behaviour, if frame pointers are not force-enabled, depends on the
@ -147,8 +147,8 @@ target.
This flag forces the generation of unwind tables. It takes one of the following This flag forces the generation of unwind tables. It takes one of the following
values: values:
* `y`, `yes`, `on`, or no value: Unwind tables are forced to be generated. * `y`, `yes`, `on`, `true` or no value: Unwind tables are forced to be generated.
* `n`, `no`, or `off`: Unwind tables are not forced to be generated. If unwind * `n`, `no`, `off` or `false`: Unwind tables are not forced to be generated. If unwind
tables are required by the target an error will be emitted. tables are required by the target an error will be emitted.
The default if not specified depends on the target. The default if not specified depends on the target.
@ -202,8 +202,8 @@ options should be separated by spaces.
This flag controls whether the linker will keep dead code. It takes one of This flag controls whether the linker will keep dead code. It takes one of
the following values: the following values:
* `y`, `yes`, `on`, or no value: keep dead code. * `y`, `yes`, `on`, `true` or no value: keep dead code.
* `n`, `no`, or `off`: remove dead code (the default). * `n`, `no`, `off` or `false`: remove dead code (the default).
An example of when this flag might be useful is when trying to construct code coverage An example of when this flag might be useful is when trying to construct code coverage
metrics. metrics.
@ -215,8 +215,8 @@ linker will use libraries and objects shipped with Rust instead or those in the
It takes one of the following values: It takes one of the following values:
* no value: rustc will use heuristic to disable self-contained mode if system has necessary tools. * no value: rustc will use heuristic to disable self-contained mode if system has necessary tools.
* `y`, `yes`, `on`: use only libraries/objects shipped with Rust. * `y`, `yes`, `on`, `true`: use only libraries/objects shipped with Rust.
* `n`, `no`, or `off`: rely on the user or the linker to provide non-Rust libraries/objects. * `n`, `no`, `off` or `false`: rely on the user or the linker to provide non-Rust libraries/objects.
This allows overriding cases when detection fails or user wants to use shipped libraries. This allows overriding cases when detection fails or user wants to use shipped libraries.
@ -261,8 +261,8 @@ This flag defers LTO optimizations to the linker. See
[linker-plugin-LTO](../linker-plugin-lto.md) for more details. It takes one of [linker-plugin-LTO](../linker-plugin-lto.md) for more details. It takes one of
the following values: the following values:
* `y`, `yes`, `on`, or no value: enable linker plugin LTO. * `y`, `yes`, `on`, `true` or no value: enable linker plugin LTO.
* `n`, `no`, or `off`: disable linker plugin LTO (the default). * `n`, `no`, `off` or `false`: disable linker plugin LTO (the default).
* A path to the linker plugin. * A path to the linker plugin.
More specifically this flag will cause the compiler to replace its typical More specifically this flag will cause the compiler to replace its typical
@ -292,9 +292,9 @@ optimizations](https://llvm.org/docs/LinkTimeOptimization.html) to produce
better optimized code, using whole-program analysis, at the cost of longer better optimized code, using whole-program analysis, at the cost of longer
linking time. It takes one of the following values: linking time. It takes one of the following values:
* `y`, `yes`, `on`, `fat`, or no value: perform "fat" LTO which attempts to * `y`, `yes`, `on`, `true`, `fat`, or no value: perform "fat" LTO which attempts to
perform optimizations across all crates within the dependency graph. perform optimizations across all crates within the dependency graph.
* `n`, `no`, `off`: disables LTO. * `n`, `no`, `off`, `false`: disables LTO.
* `thin`: perform ["thin" * `thin`: perform ["thin"
LTO](http://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html). LTO](http://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html).
This is similar to "fat", but takes substantially less time to run while This is similar to "fat", but takes substantially less time to run while
@ -333,8 +333,8 @@ This flag allows you to disable [the
red zone](https://en.wikipedia.org/wiki/Red_zone_\(computing\)). It takes one red zone](https://en.wikipedia.org/wiki/Red_zone_\(computing\)). It takes one
of the following values: of the following values:
* `y`, `yes`, `on`, or no value: disable the red zone. * `y`, `yes`, `on`, `true` or no value: disable the red zone.
* `n`, `no`, or `off`: enable the red zone. * `n`, `no`, `off` or `false`: enable the red zone.
The default behaviour, if the flag is not specified, depends on the target. The default behaviour, if the flag is not specified, depends on the target.
@ -376,8 +376,8 @@ overflow](../../reference/expressions/operator-expr.md#overflow). When
overflow-checks are enabled, a panic will occur on overflow. This flag takes overflow-checks are enabled, a panic will occur on overflow. This flag takes
one of the following values: one of the following values:
* `y`, `yes`, `on`, or no value: enable overflow checks. * `y`, `yes`, `on`, `true` or no value: enable overflow checks.
* `n`, `no`, or `off`: disable overflow checks. * `n`, `no`, `off` or `false`: disable overflow checks.
If not specified, overflow checks are enabled if If not specified, overflow checks are enabled if
[debug-assertions](#debug-assertions) are enabled, disabled otherwise. [debug-assertions](#debug-assertions) are enabled, disabled otherwise.
@ -409,8 +409,8 @@ for determining whether or not it is possible to statically or dynamically
link with a dependency. For example, `cdylib` crate types may only use static link with a dependency. For example, `cdylib` crate types may only use static
linkage. This flag takes one of the following values: linkage. This flag takes one of the following values:
* `y`, `yes`, `on`, or no value: use dynamic linking. * `y`, `yes`, `on`, `true` or no value: use dynamic linking.
* `n`, `no`, or `off`: use static linking (the default). * `n`, `no`, `off` or `false`: use static linking (the default).
## profile-generate ## profile-generate
@ -487,24 +487,24 @@ The list of passes should be separated by spaces.
This flag controls whether [`rpath`](https://en.wikipedia.org/wiki/Rpath) is This flag controls whether [`rpath`](https://en.wikipedia.org/wiki/Rpath) is
enabled. It takes one of the following values: enabled. It takes one of the following values:
* `y`, `yes`, `on`, or no value: enable rpath. * `y`, `yes`, `on`, `true` or no value: enable rpath.
* `n`, `no`, or `off`: disable rpath (the default). * `n`, `no`, `off` or `false`: disable rpath (the default).
## save-temps ## save-temps
This flag controls whether temporary files generated during compilation are This flag controls whether temporary files generated during compilation are
deleted once compilation finishes. It takes one of the following values: deleted once compilation finishes. It takes one of the following values:
* `y`, `yes`, `on`, or no value: save temporary files. * `y`, `yes`, `on`, `true` or no value: save temporary files.
* `n`, `no`, or `off`: delete temporary files (the default). * `n`, `no`, `off` or `false`: delete temporary files (the default).
## soft-float ## soft-float
This option controls whether `rustc` generates code that emulates floating This option controls whether `rustc` generates code that emulates floating
point instructions in software. It takes one of the following values: point instructions in software. It takes one of the following values:
* `y`, `yes`, `on`, or no value: use soft floats. * `y`, `yes`, `on`, `true` or no value: use soft floats.
* `n`, `no`, or `off`: use hardware floats (the default). * `n`, `no`, `off` or `false`: use hardware floats (the default).
## split-debuginfo ## split-debuginfo

View file

@ -1109,7 +1109,7 @@ fn item_typedef(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clea
fn item_union(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, s: &clean::Union) { fn item_union(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, s: &clean::Union) {
wrap_item(w, |w| { wrap_item(w, |w| {
render_attributes_in_pre(w, it, ""); render_attributes_in_pre(w, it, "");
render_union(w, it, Some(&s.generics), &s.fields, "", cx); render_union(w, it, Some(&s.generics), &s.fields, cx);
}); });
document(w, cx, it, None, HeadingOffset::H2); document(w, cx, it, None, HeadingOffset::H2);
@ -1628,7 +1628,6 @@ fn render_union(
it: &clean::Item, it: &clean::Item,
g: Option<&clean::Generics>, g: Option<&clean::Generics>,
fields: &[clean::Item], fields: &[clean::Item],
tab: &str,
cx: &Context<'_>, cx: &Context<'_>,
) { ) {
let tcx = cx.tcx(); let tcx = cx.tcx();
@ -1651,7 +1650,7 @@ fn render_union(
w.write_str(" "); w.write_str(" ");
} }
write!(w, "{{\n{}", tab); write!(w, "{{\n");
let count_fields = let count_fields =
fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count(); fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count();
let toggle = should_hide_fields(count_fields); let toggle = should_hide_fields(count_fields);
@ -1663,17 +1662,16 @@ fn render_union(
if let clean::StructFieldItem(ref ty) = *field.kind { if let clean::StructFieldItem(ref ty) = *field.kind {
write!( write!(
w, w,
" {}{}: {},\n{}", " {}{}: {},\n",
visibility_print_with_space(field.visibility(tcx), field.item_id, cx), visibility_print_with_space(field.visibility(tcx), field.item_id, cx),
field.name.unwrap(), field.name.unwrap(),
ty.print(cx), ty.print(cx)
tab
); );
} }
} }
if it.has_stripped_entries().unwrap() { if it.has_stripped_entries().unwrap() {
write!(w, " /* private fields */\n{}", tab); write!(w, " /* private fields */\n");
} }
if toggle { if toggle {
toggle_close(w); toggle_close(w);

View file

@ -814,9 +814,9 @@ fn main_args(at_args: &[String]) -> MainResult {
sess.fatal("Compilation failed, aborting rustdoc"); sess.fatal("Compilation failed, aborting rustdoc");
} }
let mut global_ctxt = abort_on_err(queries.global_ctxt(), sess); let mut gcx = abort_on_err(queries.global_ctxt(), sess);
global_ctxt.enter(|tcx| { gcx.enter(|tcx| {
let (krate, render_opts, mut cache) = sess.time("run_global_ctxt", || { let (krate, render_opts, mut cache) = sess.time("run_global_ctxt", || {
core::run_global_ctxt( core::run_global_ctxt(
tcx, tcx,

View file

@ -1,7 +1,7 @@
// This test checks that the call to memchr/slice_contains is optimized away // This test checks that the call to memchr/slice_contains is optimized away
// when searching in small slices. // when searching in small slices.
// compile-flags: -O -Zinline-mir=no // compile-flags: -O -Zinline-mir=false
// only-x86_64 // only-x86_64
#![crate_type = "lib"] #![crate_type = "lib"]

View file

@ -8,7 +8,7 @@
// //
// The test is much cleaner if we deduplicate, though. // The test is much cleaner if we deduplicate, though.
// compile-flags: -Z deduplicate-diagnostics=yes // compile-flags: -Z deduplicate-diagnostics=true
#![forbid( #![forbid(
unsafe_code, unsafe_code,

View file

@ -1,5 +1,5 @@
// run-pass // run-pass
// compile-flags: -C debug_assertions=yes // compile-flags: -C debug_assertions=true
// needs-unwind // needs-unwind
// ignore-emscripten dies with an LLVM error // ignore-emscripten dies with an LLVM error

View file

@ -1,6 +1,6 @@
// run-pass // run-pass
// revisions: default mir-opt // revisions: default mir-opt
//[default] compile-flags: -Zinline-mir=no //[default] compile-flags: -Zinline-mir=false
//[mir-opt] compile-flags: -Zmir-opt-level=4 //[mir-opt] compile-flags: -Zmir-opt-level=4
use std::panic::Location; use std::panic::Location;

View file

@ -1,5 +1,5 @@
// known-bug: unknown
// compile-flags: -Ztrait-solver=next // compile-flags: -Ztrait-solver=next
// check-pass
// This tests checks that we update results in the provisional cache when // This tests checks that we update results in the provisional cache when
// we pop a goal from the stack. // we pop a goal from the stack.

View file

@ -1,11 +0,0 @@
error[E0283]: type annotations needed: cannot satisfy `Bar<T>: Coinductive`
--> $DIR/provisional-result-done.rs:16:25
|
LL | impl<T> Coinductive for Bar<T>
| ^^^^^^
|
= note: cannot satisfy `Bar<T>: Coinductive`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0283`.