mirror of https://github.com/rust-lang/rust.git
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:
commit
9b8dbd558c
|
@ -4773,6 +4773,7 @@ checksum = "8ba09476327c4b70ccefb6180f046ef588c26a24cf5d269a9feba316eb4f029f"
|
|||
name = "rustc_trait_selection"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"itertools",
|
||||
"rustc_ast",
|
||||
"rustc_attr",
|
||||
"rustc_data_structures",
|
||||
|
|
|
@ -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)
|
||||
==========================
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ fn eval_body_using_ecx<'mir, 'tcx>(
|
|||
|
||||
trace!(
|
||||
"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))
|
||||
);
|
||||
|
||||
|
|
|
@ -203,12 +203,10 @@ impl CanonicalizeMode for CanonicalizeQueryResponse {
|
|||
// rust-lang/rust#57464: `impl Trait` can leak local
|
||||
// scopes (in manner violating typeck). Therefore, use
|
||||
// `delay_span_bug` to allow type error over an ICE.
|
||||
ty::tls::with(|tcx| {
|
||||
tcx.sess.delay_span_bug(
|
||||
rustc_span::DUMMY_SP,
|
||||
&format!("unexpected region in query response: `{:?}`", r),
|
||||
);
|
||||
});
|
||||
canonicalizer.tcx.sess.delay_span_bug(
|
||||
rustc_span::DUMMY_SP,
|
||||
&format!("unexpected region in query response: `{:?}`", r),
|
||||
);
|
||||
r
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ fn track_diagnostic(diagnostic: &mut Diagnostic, f: &mut dyn FnMut(&mut Diagnost
|
|||
|
||||
// Diagnostics are tracked, we can ignore the dependency.
|
||||
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.
|
||||
|
|
|
@ -738,30 +738,16 @@ pub static DEFAULT_EXTERN_QUERY_PROVIDERS: LazyLock<ExternProviders> = LazyLock:
|
|||
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>(
|
||||
compiler: &'tcx Compiler,
|
||||
lint_store: Lrc<LintStore>,
|
||||
dep_graph: DepGraph,
|
||||
untracked: Untracked,
|
||||
queries: &'tcx OnceCell<TcxQueries<'tcx>>,
|
||||
global_ctxt: &'tcx OnceCell<GlobalCtxt<'tcx>>,
|
||||
gcx_cell: &'tcx OnceCell<GlobalCtxt<'tcx>>,
|
||||
arena: &'tcx WorkerLocal<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
|
||||
// read, since we haven't even constructed the *input* to
|
||||
// incr. comp. yet.
|
||||
|
@ -785,8 +771,8 @@ pub fn create_global_ctxt<'tcx>(
|
|||
TcxQueries::new(local_providers, extern_providers, query_result_on_disk_cache)
|
||||
});
|
||||
|
||||
let gcx = sess.time("setup_global_ctxt", || {
|
||||
global_ctxt.get_or_init(move || {
|
||||
sess.time("setup_global_ctxt", || {
|
||||
gcx_cell.get_or_init(move || {
|
||||
TyCtxt::create_global_ctxt(
|
||||
sess,
|
||||
lint_store,
|
||||
|
@ -799,9 +785,7 @@ pub fn create_global_ctxt<'tcx>(
|
|||
rustc_query_impl::query_callbacks(arena),
|
||||
)
|
||||
})
|
||||
});
|
||||
|
||||
QueryContext { gcx }
|
||||
})
|
||||
}
|
||||
|
||||
/// Runs the resolution, type-checking, region checking and other
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use crate::errors::{FailedWritingFile, RustcErrorFatal, RustcErrorUnexpectedAnnotation};
|
||||
use crate::interface::{Compiler, Result};
|
||||
use crate::passes::{self, BoxedResolver, QueryContext};
|
||||
use crate::passes::{self, BoxedResolver};
|
||||
|
||||
use rustc_ast as ast;
|
||||
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 {
|
||||
(*self.0).get_mut().enter(f)
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ impl<T> Default for Query<T> {
|
|||
|
||||
pub struct Queries<'tcx> {
|
||||
compiler: &'tcx Compiler,
|
||||
gcx: OnceCell<GlobalCtxt<'tcx>>,
|
||||
gcx_cell: OnceCell<GlobalCtxt<'tcx>>,
|
||||
queries: OnceCell<TcxQueries<'tcx>>,
|
||||
|
||||
arena: WorkerLocal<Arena<'tcx>>,
|
||||
|
@ -90,7 +90,8 @@ pub struct Queries<'tcx> {
|
|||
register_plugins: Query<(ast::Crate, Lrc<LintStore>)>,
|
||||
expansion: Query<(Lrc<ast::Crate>, Rc<RefCell<BoxedResolver>>, Lrc<LintStore>)>,
|
||||
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>>,
|
||||
}
|
||||
|
||||
|
@ -98,7 +99,7 @@ impl<'tcx> Queries<'tcx> {
|
|||
pub fn new(compiler: &'tcx Compiler) -> Queries<'tcx> {
|
||||
Queries {
|
||||
compiler,
|
||||
gcx: OnceCell::new(),
|
||||
gcx_cell: OnceCell::new(),
|
||||
queries: OnceCell::new(),
|
||||
arena: WorkerLocal::new(|_| Arena::default()),
|
||||
hir_arena: WorkerLocal::new(|_| rustc_hir::Arena::default()),
|
||||
|
@ -108,7 +109,7 @@ impl<'tcx> Queries<'tcx> {
|
|||
register_plugins: Default::default(),
|
||||
expansion: Default::default(),
|
||||
dep_graph: Default::default(),
|
||||
global_ctxt: Default::default(),
|
||||
gcx: Default::default(),
|
||||
ongoing_codegen: Default::default(),
|
||||
}
|
||||
}
|
||||
|
@ -207,8 +208,8 @@ impl<'tcx> Queries<'tcx> {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn global_ctxt(&'tcx self) -> Result<QueryResult<'_, QueryContext<'tcx>>> {
|
||||
self.global_ctxt.compute(|| {
|
||||
pub fn global_ctxt(&'tcx self) -> Result<QueryResult<'_, &'tcx GlobalCtxt<'tcx>>> {
|
||||
self.gcx.compute(|| {
|
||||
let crate_name = *self.crate_name()?.borrow();
|
||||
let (krate, resolver, lint_store) = self.expansion()?.steal();
|
||||
|
||||
|
@ -218,18 +219,18 @@ impl<'tcx> Queries<'tcx> {
|
|||
ast_lowering: untracked_resolver_for_lowering,
|
||||
} = BoxedResolver::to_resolver_outputs(resolver);
|
||||
|
||||
let mut qcx = passes::create_global_ctxt(
|
||||
let gcx = passes::create_global_ctxt(
|
||||
self.compiler,
|
||||
lint_store,
|
||||
self.dep_graph()?.steal(),
|
||||
untracked,
|
||||
&self.queries,
|
||||
&self.gcx,
|
||||
&self.gcx_cell,
|
||||
&self.arena,
|
||||
&self.hir_arena,
|
||||
);
|
||||
|
||||
qcx.enter(|tcx| {
|
||||
gcx.enter(|tcx| {
|
||||
let feed = tcx.feed_unit_query();
|
||||
feed.resolver_for_lowering(
|
||||
tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, krate))),
|
||||
|
@ -239,7 +240,7 @@ impl<'tcx> Queries<'tcx> {
|
|||
let feed = tcx.feed_local_crate();
|
||||
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,
|
||||
// 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();
|
||||
// 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.
|
||||
|
|
|
@ -55,7 +55,7 @@ impl rustc_query_system::dep_graph::DepKind for DepKind {
|
|||
ty::tls::with_context(|icx| {
|
||||
let icx = ty::tls::ImplicitCtxt { task_deps, ..icx.clone() };
|
||||
|
||||
ty::tls::enter_context(&icx, |_| op())
|
||||
ty::tls::enter_context(&icx, op)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#![feature(get_mut_unchecked)]
|
||||
#![feature(if_let_guard)]
|
||||
#![feature(iter_from_generator)]
|
||||
#![feature(local_key_cell_methods)]
|
||||
#![feature(negative_impls)]
|
||||
#![feature(never_type)]
|
||||
#![feature(extern_types)]
|
||||
|
|
|
@ -468,6 +468,18 @@ pub struct GlobalCtxt<'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> {
|
||||
/// Expects a body and returns its codegen attributes.
|
||||
///
|
||||
|
|
|
@ -89,9 +89,8 @@ mod tlv {
|
|||
/// This is used to set the pointer to the new `ImplicitCtxt`.
|
||||
#[inline]
|
||||
pub(super) fn with_tlv<F: FnOnce() -> R, R>(value: *const (), f: F) -> R {
|
||||
let old = get_tlv();
|
||||
let _reset = rustc_data_structures::OnDrop(move || TLV.with(|tlv| tlv.set(old)));
|
||||
TLV.with(|tlv| tlv.set(value));
|
||||
let old = TLV.replace(value);
|
||||
let _reset = rustc_data_structures::OnDrop(move || TLV.set(old));
|
||||
f()
|
||||
}
|
||||
}
|
||||
|
@ -110,9 +109,9 @@ unsafe fn downcast<'a, 'tcx>(context: *const ()) -> &'a ImplicitCtxt<'a, 'tcx> {
|
|||
#[inline]
|
||||
pub fn enter_context<'a, 'tcx, F, R>(context: &ImplicitCtxt<'a, 'tcx>, f: F) -> R
|
||||
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.
|
||||
|
|
|
@ -124,7 +124,7 @@ impl QueryContext for QueryCtxt<'_> {
|
|||
};
|
||||
|
||||
// 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)
|
||||
})
|
||||
})
|
||||
|
|
|
@ -349,7 +349,7 @@ fn build_options<O: Default>(
|
|||
#[allow(non_upper_case_globals)]
|
||||
mod desc {
|
||||
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_string: &str = "a 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.
|
||||
pub(crate) fn parse_bool(slot: &mut bool, v: Option<&str>) -> bool {
|
||||
match v {
|
||||
Some("y") | Some("yes") | Some("on") | None => {
|
||||
Some("y") | Some("yes") | Some("on") | Some("true") | None => {
|
||||
*slot = true;
|
||||
true
|
||||
}
|
||||
Some("n") | Some("no") | Some("off") => {
|
||||
Some("n") | Some("no") | Some("off") | Some("false") => {
|
||||
*slot = false;
|
||||
true
|
||||
}
|
||||
|
@ -450,11 +450,11 @@ mod parse {
|
|||
/// other factors, such as other options, or target options.)
|
||||
pub(crate) fn parse_opt_bool(slot: &mut Option<bool>, v: Option<&str>) -> bool {
|
||||
match v {
|
||||
Some("y") | Some("yes") | Some("on") | None => {
|
||||
Some("y") | Some("yes") | Some("on") | Some("true") | None => {
|
||||
*slot = Some(true);
|
||||
true
|
||||
}
|
||||
Some("n") | Some("no") | Some("off") => {
|
||||
Some("n") | Some("no") | Some("off") | Some("false") => {
|
||||
*slot = Some(false);
|
||||
true
|
||||
}
|
||||
|
|
|
@ -24,3 +24,4 @@ rustc_span = { path = "../rustc_span" }
|
|||
rustc_target = { path = "../rustc_target" }
|
||||
rustc_transmute = { path = "../rustc_transmute", features = ["rustc"] }
|
||||
smallvec = { version = "1.8.1", features = ["union", "may_dangle"] }
|
||||
itertools = "0.10.1"
|
||||
|
|
|
@ -4,6 +4,7 @@ use super::infcx_ext::InferCtxtExt;
|
|||
#[cfg(doc)]
|
||||
use super::trait_goals::structural_traits::*;
|
||||
use super::{CanonicalResponse, Certainty, EvalCtxt, Goal, MaybeCause, QueryResult};
|
||||
use itertools::Itertools;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_infer::traits::query::NoSolution;
|
||||
use rustc_infer::traits::util::elaborate_predicates;
|
||||
|
@ -489,9 +490,9 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
|||
i += 1;
|
||||
}
|
||||
|
||||
// If there are *STILL* multiple candidates, give up
|
||||
// and report ambiguity.
|
||||
if candidates.len() > 1 {
|
||||
// If there are *STILL* multiple candidates that have *different* response
|
||||
// results, give up and report ambiguity.
|
||||
if candidates.len() > 1 && !candidates.iter().map(|cand| cand.result).all_equal() {
|
||||
let certainty = if candidates.iter().all(|x| {
|
||||
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)
|
||||
}
|
||||
|
||||
|
|
|
@ -98,6 +98,7 @@ impl<'tcx, 'a> GeneratorData<'tcx, 'a> {
|
|||
// obligation
|
||||
fn get_from_await_ty<F>(
|
||||
&self,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
visitor: AwaitsVisitor,
|
||||
hir: map::Map<'tcx>,
|
||||
ty_matches: F,
|
||||
|
@ -134,9 +135,7 @@ impl<'tcx, 'a> GeneratorData<'tcx, 'a> {
|
|||
.unwrap_or_else(|| {
|
||||
bug!(
|
||||
"node_type: no type for node {}",
|
||||
ty::tls::with(|tcx| tcx
|
||||
.hir()
|
||||
.node_to_string(await_expr.hir_id))
|
||||
tcx.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 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);
|
||||
|
||||
// The generator interior types share the same binders
|
||||
|
|
|
@ -229,10 +229,10 @@ impl Config {
|
|||
"--retry",
|
||||
"3",
|
||||
"-Sf",
|
||||
"-o",
|
||||
]);
|
||||
curl.arg(tempfile);
|
||||
curl.arg(url);
|
||||
let f = File::create(tempfile).unwrap();
|
||||
curl.stdout(Stdio::from(f));
|
||||
if !self.check_run(&mut curl) {
|
||||
if self.build.contains("windows-msvc") {
|
||||
println!("Fallback to PowerShell");
|
||||
|
|
|
@ -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.
|
||||
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
|
||||
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
|
||||
|
||||
|
@ -60,8 +60,8 @@ This flag lets you turn `cfg(debug_assertions)` [conditional
|
|||
compilation](../../reference/conditional-compilation.md#debug_assertions) on
|
||||
or off. It takes one of the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: enable debug-assertions.
|
||||
* `n`, `no`, or `off`: disable debug-assertions.
|
||||
* `y`, `yes`, `on`, `true`, or no value: enable debug-assertions.
|
||||
* `n`, `no`, `off` or `false`: disable debug-assertions.
|
||||
|
||||
If not specified, debug assertions are automatically enabled only if the
|
||||
[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.
|
||||
It takes one of the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: include default libraries (the default).
|
||||
* `n`, `no`, or `off`: exclude default libraries.
|
||||
* `y`, `yes`, `on`, `true` or no value: include default libraries (the default).
|
||||
* `n`, `no`, `off` or `false`: exclude default libraries.
|
||||
|
||||
For example, for gcc flavor linkers, this issues the `-nodefaultlibs` flag to
|
||||
the linker.
|
||||
|
@ -93,8 +93,8 @@ the linker.
|
|||
This flag controls whether or not the compiler embeds LLVM bitcode into object
|
||||
files. It takes one of the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: put bitcode in rlibs (the default).
|
||||
* `n`, `no`, or `off`: omit bitcode from rlibs.
|
||||
* `y`, `yes`, `on`, `true` or no value: put bitcode in rlibs (the default).
|
||||
* `n`, `no`, `off` or `false`: omit bitcode from rlibs.
|
||||
|
||||
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
|
||||
|
@ -135,8 +135,8 @@ flag][option-emit] for more information.
|
|||
This flag forces the use of frame pointers. It takes one of the following
|
||||
values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: force-enable frame pointers.
|
||||
* `n`, `no`, or `off`: do not force-enable frame pointers. This does
|
||||
* `y`, `yes`, `on`, `true` or no value: force-enable frame pointers.
|
||||
* `n`, `no`, `off` or `false`: do not force-enable frame pointers. This does
|
||||
not necessarily mean frame pointers will be removed.
|
||||
|
||||
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
|
||||
values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: Unwind tables are forced to be generated.
|
||||
* `n`, `no`, or `off`: Unwind tables are not forced to be generated. If unwind
|
||||
* `y`, `yes`, `on`, `true` or no value: Unwind tables are forced to be generated.
|
||||
* `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.
|
||||
|
||||
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
|
||||
the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: keep dead code.
|
||||
* `n`, `no`, or `off`: remove dead code (the default).
|
||||
* `y`, `yes`, `on`, `true` or no value: keep dead code.
|
||||
* `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
|
||||
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:
|
||||
|
||||
* 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.
|
||||
* `n`, `no`, or `off`: rely on the user or the linker to provide non-Rust libraries/objects.
|
||||
* `y`, `yes`, `on`, `true`: use only libraries/objects shipped with Rust.
|
||||
* `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.
|
||||
|
||||
|
@ -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
|
||||
the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: enable linker plugin LTO.
|
||||
* `n`, `no`, or `off`: disable linker plugin LTO (the default).
|
||||
* `y`, `yes`, `on`, `true` or no value: enable linker plugin LTO.
|
||||
* `n`, `no`, `off` or `false`: disable linker plugin LTO (the default).
|
||||
* A path to the linker plugin.
|
||||
|
||||
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
|
||||
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.
|
||||
* `n`, `no`, `off`: disables LTO.
|
||||
* `n`, `no`, `off`, `false`: disables LTO.
|
||||
* `thin`: perform ["thin"
|
||||
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
|
||||
|
@ -333,8 +333,8 @@ This flag allows you to disable [the
|
|||
red zone](https://en.wikipedia.org/wiki/Red_zone_\(computing\)). It takes one
|
||||
of the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: disable the red zone.
|
||||
* `n`, `no`, or `off`: enable the red zone.
|
||||
* `y`, `yes`, `on`, `true` or no value: disable 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.
|
||||
|
||||
|
@ -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
|
||||
one of the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: enable overflow checks.
|
||||
* `n`, `no`, or `off`: disable overflow checks.
|
||||
* `y`, `yes`, `on`, `true` or no value: enable overflow checks.
|
||||
* `n`, `no`, `off` or `false`: disable overflow checks.
|
||||
|
||||
If not specified, overflow checks are enabled if
|
||||
[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
|
||||
linkage. This flag takes one of the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: use dynamic linking.
|
||||
* `n`, `no`, or `off`: use static linking (the default).
|
||||
* `y`, `yes`, `on`, `true` or no value: use dynamic linking.
|
||||
* `n`, `no`, `off` or `false`: use static linking (the default).
|
||||
|
||||
## 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
|
||||
enabled. It takes one of the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: enable rpath.
|
||||
* `n`, `no`, or `off`: disable rpath (the default).
|
||||
* `y`, `yes`, `on`, `true` or no value: enable rpath.
|
||||
* `n`, `no`, `off` or `false`: disable rpath (the default).
|
||||
|
||||
## save-temps
|
||||
|
||||
This flag controls whether temporary files generated during compilation are
|
||||
deleted once compilation finishes. It takes one of the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: save temporary files.
|
||||
* `n`, `no`, or `off`: delete temporary files (the default).
|
||||
* `y`, `yes`, `on`, `true` or no value: save temporary files.
|
||||
* `n`, `no`, `off` or `false`: delete temporary files (the default).
|
||||
|
||||
## soft-float
|
||||
|
||||
This option controls whether `rustc` generates code that emulates floating
|
||||
point instructions in software. It takes one of the following values:
|
||||
|
||||
* `y`, `yes`, `on`, or no value: use soft floats.
|
||||
* `n`, `no`, or `off`: use hardware floats (the default).
|
||||
* `y`, `yes`, `on`, `true` or no value: use soft floats.
|
||||
* `n`, `no`, `off` or `false`: use hardware floats (the default).
|
||||
|
||||
## split-debuginfo
|
||||
|
||||
|
|
|
@ -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) {
|
||||
wrap_item(w, |w| {
|
||||
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);
|
||||
|
@ -1628,7 +1628,6 @@ fn render_union(
|
|||
it: &clean::Item,
|
||||
g: Option<&clean::Generics>,
|
||||
fields: &[clean::Item],
|
||||
tab: &str,
|
||||
cx: &Context<'_>,
|
||||
) {
|
||||
let tcx = cx.tcx();
|
||||
|
@ -1651,7 +1650,7 @@ fn render_union(
|
|||
w.write_str(" ");
|
||||
}
|
||||
|
||||
write!(w, "{{\n{}", tab);
|
||||
write!(w, "{{\n");
|
||||
let count_fields =
|
||||
fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count();
|
||||
let toggle = should_hide_fields(count_fields);
|
||||
|
@ -1663,17 +1662,16 @@ fn render_union(
|
|||
if let clean::StructFieldItem(ref ty) = *field.kind {
|
||||
write!(
|
||||
w,
|
||||
" {}{}: {},\n{}",
|
||||
" {}{}: {},\n",
|
||||
visibility_print_with_space(field.visibility(tcx), field.item_id, cx),
|
||||
field.name.unwrap(),
|
||||
ty.print(cx),
|
||||
tab
|
||||
ty.print(cx)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if it.has_stripped_entries().unwrap() {
|
||||
write!(w, " /* private fields */\n{}", tab);
|
||||
write!(w, " /* private fields */\n");
|
||||
}
|
||||
if toggle {
|
||||
toggle_close(w);
|
||||
|
|
|
@ -814,9 +814,9 @@ fn main_args(at_args: &[String]) -> MainResult {
|
|||
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", || {
|
||||
core::run_global_ctxt(
|
||||
tcx,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// This test checks that the call to memchr/slice_contains is optimized away
|
||||
// when searching in small slices.
|
||||
|
||||
// compile-flags: -O -Zinline-mir=no
|
||||
// compile-flags: -O -Zinline-mir=false
|
||||
// only-x86_64
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
//
|
||||
// The test is much cleaner if we deduplicate, though.
|
||||
|
||||
// compile-flags: -Z deduplicate-diagnostics=yes
|
||||
// compile-flags: -Z deduplicate-diagnostics=true
|
||||
|
||||
#![forbid(
|
||||
unsafe_code,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// run-pass
|
||||
// compile-flags: -C debug_assertions=yes
|
||||
// compile-flags: -C debug_assertions=true
|
||||
// needs-unwind
|
||||
// ignore-emscripten dies with an LLVM error
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// run-pass
|
||||
// revisions: default mir-opt
|
||||
//[default] compile-flags: -Zinline-mir=no
|
||||
//[default] compile-flags: -Zinline-mir=false
|
||||
//[mir-opt] compile-flags: -Zmir-opt-level=4
|
||||
|
||||
use std::panic::Location;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// known-bug: unknown
|
||||
// compile-flags: -Ztrait-solver=next
|
||||
// check-pass
|
||||
|
||||
// This tests checks that we update results in the provisional cache when
|
||||
// we pop a goal from the stack.
|
||||
|
|
|
@ -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`.
|
Loading…
Reference in New Issue