Auto merge of #124015 - GuillaumeGomez:rollup-s46ksxa, r=GuillaumeGomez
Rollup of 14 pull requests Successful merges: - #120781 (Correct usage note on OpenOptions::append()) - #121694 (sess: stabilize `-Zrelro-level` as `-Crelro-level`) - #122521 (doc(bootstrap): add top-level doc-comment to utils/tarball.rs) - #123491 (Fix ICE in `eval_body_using_ecx`) - #123574 (rustdoc: rename `issue-\d+.rs` tests to have meaningful names (part 6)) - #123687 (Update ar_archive_writer to 0.2.0) - #123721 (Various visionOS fixes) - #123797 (Better graphviz output for SCCs and NLL constraints) - #123990 (Make `suggest_deref_closure_return` more idiomatic/easier to understand) - #123995 (Make `thir_tree` and `thir_flat` into hooks) - #123998 (Opaque types have no namespace) - #124001 (Fix docs for unstable_features lint.) - #124006 (Move size assertions for `mir::syntax` types into the same file) - #124011 (rustdoc: update the module-level docs of `rustdoc::clean`) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
1dea922ea6
63 changed files with 349 additions and 219 deletions
|
@ -26,7 +26,6 @@ use rustc_middle::ty::{self, RegionVid, Ty};
|
|||
use rustc_middle::ty::{Region, TyCtxt};
|
||||
use rustc_span::symbol::{kw, Ident};
|
||||
use rustc_span::Span;
|
||||
use rustc_trait_selection::infer::type_variable::TypeVariableOrigin;
|
||||
use rustc_trait_selection::infer::InferCtxtExt;
|
||||
use rustc_trait_selection::traits::{Obligation, ObligationCtxt};
|
||||
|
||||
|
@ -813,7 +812,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
self.add_static_impl_trait_suggestion(&mut diag, *fr, fr_name, *outlived_fr);
|
||||
self.suggest_adding_lifetime_params(&mut diag, *fr, *outlived_fr);
|
||||
self.suggest_move_on_borrowing_closure(&mut diag);
|
||||
self.suggest_deref_closure_value(&mut diag);
|
||||
self.suggest_deref_closure_return(&mut diag);
|
||||
|
||||
diag
|
||||
}
|
||||
|
@ -1048,115 +1047,107 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
/// When encountering a lifetime error caused by the return type of a closure, check the
|
||||
/// corresponding trait bound and see if dereferencing the closure return value would satisfy
|
||||
/// them. If so, we produce a structured suggestion.
|
||||
fn suggest_deref_closure_value(&self, diag: &mut Diag<'_>) {
|
||||
fn suggest_deref_closure_return(&self, diag: &mut Diag<'_>) {
|
||||
let tcx = self.infcx.tcx;
|
||||
let map = tcx.hir();
|
||||
|
||||
// Get the closure return value and type.
|
||||
let body_id = map.body_owned_by(self.mir_def_id());
|
||||
let body = &map.body(body_id);
|
||||
let value = &body.value.peel_blocks();
|
||||
let hir::Node::Expr(closure_expr) = tcx.hir_node_by_def_id(self.mir_def_id()) else {
|
||||
let closure_def_id = self.mir_def_id();
|
||||
let hir::Node::Expr(
|
||||
closure_expr @ hir::Expr {
|
||||
kind: hir::ExprKind::Closure(hir::Closure { body, .. }), ..
|
||||
},
|
||||
) = tcx.hir_node_by_def_id(closure_def_id)
|
||||
else {
|
||||
return;
|
||||
};
|
||||
let fn_call_id = tcx.parent_hir_id(self.mir_hir_id());
|
||||
let hir::Node::Expr(expr) = tcx.hir_node(fn_call_id) else { return };
|
||||
let def_id = map.enclosing_body_owner(fn_call_id);
|
||||
let tables = tcx.typeck(def_id);
|
||||
let Some(return_value_ty) = tables.node_type_opt(value.hir_id) else { return };
|
||||
let return_value_ty = self.infcx.resolve_vars_if_possible(return_value_ty);
|
||||
let ty::Closure(_, args) = *tcx.type_of(closure_def_id).instantiate_identity().kind()
|
||||
else {
|
||||
return;
|
||||
};
|
||||
let args = args.as_closure();
|
||||
|
||||
// Make sure that the parent expression is a method call.
|
||||
let parent_expr_id = tcx.parent_hir_id(self.mir_hir_id());
|
||||
let hir::Node::Expr(
|
||||
parent_expr @ hir::Expr {
|
||||
kind: hir::ExprKind::MethodCall(_, rcvr, call_args, _), ..
|
||||
},
|
||||
) = tcx.hir_node(parent_expr_id)
|
||||
else {
|
||||
return;
|
||||
};
|
||||
let typeck_results = tcx.typeck(self.mir_def_id());
|
||||
|
||||
// We don't use `ty.peel_refs()` to get the number of `*`s needed to get the root type.
|
||||
let mut ty = return_value_ty;
|
||||
let liberated_sig = tcx.liberate_late_bound_regions(closure_def_id.to_def_id(), args.sig());
|
||||
let mut peeled_ty = liberated_sig.output();
|
||||
let mut count = 0;
|
||||
while let ty::Ref(_, t, _) = ty.kind() {
|
||||
ty = *t;
|
||||
while let ty::Ref(_, ref_ty, _) = *peeled_ty.kind() {
|
||||
peeled_ty = ref_ty;
|
||||
count += 1;
|
||||
}
|
||||
if !self.infcx.type_is_copy_modulo_regions(self.param_env, ty) {
|
||||
if !self.infcx.type_is_copy_modulo_regions(self.param_env, peeled_ty) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Build a new closure where the return type is an owned value, instead of a ref.
|
||||
let Some(ty::Closure(did, args)) =
|
||||
tables.node_type_opt(closure_expr.hir_id).as_ref().map(|ty| ty.kind())
|
||||
else {
|
||||
return;
|
||||
};
|
||||
let sig = args.as_closure().sig();
|
||||
let closure_sig_as_fn_ptr_ty = Ty::new_fn_ptr(
|
||||
tcx,
|
||||
sig.map_bound(|s| {
|
||||
let unsafety = hir::Unsafety::Normal;
|
||||
use rustc_target::spec::abi;
|
||||
tcx.mk_fn_sig(
|
||||
[s.inputs()[0]],
|
||||
s.output().peel_refs(),
|
||||
s.c_variadic,
|
||||
unsafety,
|
||||
abi::Abi::Rust,
|
||||
)
|
||||
}),
|
||||
ty::Binder::dummy(tcx.mk_fn_sig(
|
||||
liberated_sig.inputs().iter().copied(),
|
||||
peeled_ty,
|
||||
liberated_sig.c_variadic,
|
||||
hir::Unsafety::Normal,
|
||||
rustc_target::spec::abi::Abi::Rust,
|
||||
)),
|
||||
);
|
||||
let parent_args = GenericArgs::identity_for_item(
|
||||
let closure_ty = Ty::new_closure(
|
||||
tcx,
|
||||
tcx.typeck_root_def_id(self.mir_def_id().to_def_id()),
|
||||
closure_def_id.to_def_id(),
|
||||
ty::ClosureArgs::new(
|
||||
tcx,
|
||||
ty::ClosureArgsParts {
|
||||
parent_args: args.parent_args(),
|
||||
closure_kind_ty: args.kind_ty(),
|
||||
tupled_upvars_ty: args.tupled_upvars_ty(),
|
||||
closure_sig_as_fn_ptr_ty,
|
||||
},
|
||||
)
|
||||
.args,
|
||||
);
|
||||
let closure_kind = args.as_closure().kind();
|
||||
let closure_kind_ty = Ty::from_closure_kind(tcx, closure_kind);
|
||||
let tupled_upvars_ty = self
|
||||
.infcx
|
||||
.next_ty_var(TypeVariableOrigin { param_def_id: None, span: closure_expr.span });
|
||||
let closure_args = ty::ClosureArgs::new(
|
||||
tcx,
|
||||
ty::ClosureArgsParts {
|
||||
parent_args,
|
||||
closure_kind_ty,
|
||||
closure_sig_as_fn_ptr_ty,
|
||||
tupled_upvars_ty,
|
||||
},
|
||||
);
|
||||
let closure_ty = Ty::new_closure(tcx, *did, closure_args.args);
|
||||
let closure_ty = tcx.erase_regions(closure_ty);
|
||||
|
||||
let hir::ExprKind::MethodCall(_, rcvr, args, _) = expr.kind else { return };
|
||||
let Some(pos) = args
|
||||
.iter()
|
||||
.enumerate()
|
||||
.find(|(_, arg)| arg.hir_id == closure_expr.hir_id)
|
||||
.map(|(i, _)| i)
|
||||
let Some((closure_arg_pos, _)) =
|
||||
call_args.iter().enumerate().find(|(_, arg)| arg.hir_id == closure_expr.hir_id)
|
||||
else {
|
||||
return;
|
||||
};
|
||||
// The found `Self` type of the method call.
|
||||
let Some(possible_rcvr_ty) = tables.node_type_opt(rcvr.hir_id) else { return };
|
||||
let Some(method_def_id) = tables.type_dependent_def_id(expr.hir_id) else { return };
|
||||
|
||||
// Get the type for the parameter corresponding to the argument the closure with the
|
||||
// lifetime error we had.
|
||||
let Some(input) = tcx
|
||||
let Some(method_def_id) = typeck_results.type_dependent_def_id(parent_expr.hir_id) else {
|
||||
return;
|
||||
};
|
||||
let Some(input_arg) = tcx
|
||||
.fn_sig(method_def_id)
|
||||
.instantiate_identity()
|
||||
.skip_binder()
|
||||
.inputs()
|
||||
.skip_binder()
|
||||
// Methods have a `self` arg, so `pos` is actually `+ 1` to match the method call arg.
|
||||
.get(pos + 1)
|
||||
.get(closure_arg_pos + 1)
|
||||
else {
|
||||
return;
|
||||
};
|
||||
|
||||
trace!(?input);
|
||||
|
||||
let ty::Param(closure_param) = input.kind() else { return };
|
||||
// If this isn't a param, then we can't substitute a new closure.
|
||||
let ty::Param(closure_param) = input_arg.kind() else { return };
|
||||
|
||||
// Get the arguments for the found method, only specifying that `Self` is the receiver type.
|
||||
let Some(possible_rcvr_ty) = typeck_results.node_type_opt(rcvr.hir_id) else { return };
|
||||
let args = GenericArgs::for_item(tcx, method_def_id, |param, _| {
|
||||
if param.index == 0 {
|
||||
possible_rcvr_ty.into()
|
||||
} else if param.index == closure_param.index {
|
||||
closure_ty.into()
|
||||
} else {
|
||||
self.infcx.var_for_def(expr.span, param)
|
||||
self.infcx.var_for_def(parent_expr.span, param)
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -1170,7 +1161,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||
|
||||
if ocx.select_all_or_error().is_empty() {
|
||||
diag.span_suggestion_verbose(
|
||||
value.span.shrink_to_lo(),
|
||||
tcx.hir().body(*body).value.peel_blocks().span.shrink_to_lo(),
|
||||
"dereference the return value",
|
||||
"*".repeat(count),
|
||||
Applicability::MachineApplicable,
|
||||
|
|
|
@ -6,7 +6,38 @@ use std::borrow::Cow;
|
|||
use std::io::{self, Write};
|
||||
|
||||
use super::*;
|
||||
use itertools::Itertools;
|
||||
use rustc_graphviz as dot;
|
||||
use rustc_middle::ty::UniverseIndex;
|
||||
|
||||
fn render_outlives_constraint(constraint: &OutlivesConstraint<'_>) -> String {
|
||||
match constraint.locations {
|
||||
Locations::All(_) => "All(...)".to_string(),
|
||||
Locations::Single(loc) => format!("{loc:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
fn render_universe(u: UniverseIndex) -> String {
|
||||
if u.is_root() {
|
||||
return "".to_string();
|
||||
}
|
||||
|
||||
format!("/{:?}", u)
|
||||
}
|
||||
|
||||
fn render_region_vid(rvid: RegionVid, regioncx: &RegionInferenceContext<'_>) -> String {
|
||||
let universe_str = render_universe(regioncx.region_definition(rvid).universe);
|
||||
|
||||
let external_name_str = if let Some(external_name) =
|
||||
regioncx.region_definition(rvid).external_name.and_then(|e| e.get_name())
|
||||
{
|
||||
format!(" ({external_name})")
|
||||
} else {
|
||||
"".to_string()
|
||||
};
|
||||
|
||||
format!("{:?}{universe_str}{external_name_str}", rvid)
|
||||
}
|
||||
|
||||
impl<'tcx> RegionInferenceContext<'tcx> {
|
||||
/// Write out the region constraint graph.
|
||||
|
@ -46,10 +77,10 @@ impl<'a, 'this, 'tcx> dot::Labeller<'this> for RawConstraints<'a, 'tcx> {
|
|||
Some(dot::LabelText::LabelStr(Cow::Borrowed("box")))
|
||||
}
|
||||
fn node_label(&'this self, n: &RegionVid) -> dot::LabelText<'this> {
|
||||
dot::LabelText::LabelStr(format!("{n:?}").into())
|
||||
dot::LabelText::LabelStr(render_region_vid(*n, self.regioncx).into())
|
||||
}
|
||||
fn edge_label(&'this self, e: &OutlivesConstraint<'tcx>) -> dot::LabelText<'this> {
|
||||
dot::LabelText::LabelStr(format!("{:?}", e.locations).into())
|
||||
dot::LabelText::LabelStr(render_outlives_constraint(e).into())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -96,8 +127,9 @@ impl<'a, 'this, 'tcx> dot::Labeller<'this> for SccConstraints<'a, 'tcx> {
|
|||
Some(dot::LabelText::LabelStr(Cow::Borrowed("box")))
|
||||
}
|
||||
fn node_label(&'this self, n: &ConstraintSccIndex) -> dot::LabelText<'this> {
|
||||
let nodes = &self.nodes_per_scc[*n];
|
||||
dot::LabelText::LabelStr(format!("{n:?} = {nodes:?}").into())
|
||||
let nodes_str =
|
||||
self.nodes_per_scc[*n].iter().map(|n| render_region_vid(*n, self.regioncx)).join(", ");
|
||||
dot::LabelText::LabelStr(format!("SCC({n}) = {{{nodes_str}}}", n = n.as_usize()).into())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1562,7 +1562,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
|
||||
// Because this free region must be in the ROOT universe, we
|
||||
// know it cannot contain any bound universes.
|
||||
assert!(self.scc_universes[longer_fr_scc] == ty::UniverseIndex::ROOT);
|
||||
assert!(self.scc_universes[longer_fr_scc].is_root());
|
||||
debug_assert!(self.scc_values.placeholders_contained_in(longer_fr_scc).next().is_none());
|
||||
|
||||
// Only check all of the relations for the main representative of each
|
||||
|
|
|
@ -213,7 +213,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
|
|||
let scc = self.constraint_sccs.scc(vid);
|
||||
|
||||
// Special handling of higher-ranked regions.
|
||||
if self.scc_universes[scc] != ty::UniverseIndex::ROOT {
|
||||
if !self.scc_universes[scc].is_root() {
|
||||
match self.scc_values.placeholders_contained_in(scc).enumerate().last() {
|
||||
// If the region contains a single placeholder then they're equal.
|
||||
Some((0, placeholder)) => {
|
||||
|
|
|
@ -5,7 +5,7 @@ edition = "2021"
|
|||
|
||||
[dependencies]
|
||||
# tidy-alphabetical-start
|
||||
ar_archive_writer = "0.1.5"
|
||||
ar_archive_writer = "0.2.0"
|
||||
bitflags = "2.4.1"
|
||||
cc = "1.0.90"
|
||||
itertools = "0.12"
|
||||
|
|
|
@ -285,14 +285,7 @@ impl<'a> ArArchiveBuilder<'a> {
|
|||
.tempfile_in(output.parent().unwrap_or_else(|| Path::new("")))
|
||||
.map_err(|err| io_error_context("couldn't create a temp file", err))?;
|
||||
|
||||
write_archive_to_stream(
|
||||
archive_tmpfile.as_file_mut(),
|
||||
&entries,
|
||||
true,
|
||||
archive_kind,
|
||||
true,
|
||||
false,
|
||||
)?;
|
||||
write_archive_to_stream(archive_tmpfile.as_file_mut(), &entries, archive_kind, false)?;
|
||||
|
||||
let any_entries = !entries.is_empty();
|
||||
drop(entries);
|
||||
|
|
|
@ -2059,7 +2059,7 @@ fn add_library_search_dirs(cmd: &mut dyn Linker, sess: &Session, self_contained:
|
|||
/// Add options making relocation sections in the produced ELF files read-only
|
||||
/// and suppressing lazy binding.
|
||||
fn add_relro_args(cmd: &mut dyn Linker, sess: &Session) {
|
||||
match sess.opts.unstable_opts.relro_level.unwrap_or(sess.target.relro_level) {
|
||||
match sess.opts.cg.relro_level.unwrap_or(sess.target.relro_level) {
|
||||
RelroLevel::Full => cmd.full_relro(),
|
||||
RelroLevel::Partial => cmd.partial_relro(),
|
||||
RelroLevel::Off => cmd.no_relro(),
|
||||
|
@ -3038,9 +3038,10 @@ fn get_apple_sdk_root(sdk_name: &str) -> Result<String, errors::AppleSdkRootErro
|
|||
|| sdkroot.contains("MacOSX.platform") => {}
|
||||
"watchsimulator"
|
||||
if sdkroot.contains("WatchOS.platform") || sdkroot.contains("MacOSX.platform") => {}
|
||||
"visionos"
|
||||
if sdkroot.contains("XROS.platform") || sdkroot.contains("MacOSX.platform") => {}
|
||||
"visionossimulator"
|
||||
"xros"
|
||||
if sdkroot.contains("XRSimulator.platform")
|
||||
|| sdkroot.contains("MacOSX.platform") => {}
|
||||
"xrsimulator"
|
||||
if sdkroot.contains("XROS.platform") || sdkroot.contains("MacOSX.platform") => {}
|
||||
// Ignore `SDKROOT` if it's not a valid path.
|
||||
_ if !p.is_absolute() || p == Path::new("/") || !p.exists() => {}
|
||||
|
|
|
@ -207,7 +207,6 @@ impl DefKind {
|
|||
| DefKind::Enum
|
||||
| DefKind::Variant
|
||||
| DefKind::Trait
|
||||
| DefKind::OpaqueTy
|
||||
| DefKind::TyAlias
|
||||
| DefKind::ForeignTy
|
||||
| DefKind::TraitAlias
|
||||
|
@ -234,7 +233,8 @@ impl DefKind {
|
|||
| DefKind::Use
|
||||
| DefKind::ForeignMod
|
||||
| DefKind::GlobalAsm
|
||||
| DefKind::Impl { .. } => None,
|
||||
| DefKind::Impl { .. }
|
||||
| DefKind::OpaqueTy => None,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -624,6 +624,7 @@ fn test_codegen_options_tracking_hash() {
|
|||
tracked!(profile_generate, SwitchWithOptPath::Enabled(None));
|
||||
tracked!(profile_use, Some(PathBuf::from("abc")));
|
||||
tracked!(relocation_model, Some(RelocModel::Pic));
|
||||
tracked!(relro_level, Some(RelroLevel::Full));
|
||||
tracked!(soft_float, true);
|
||||
tracked!(split_debuginfo, Some(SplitDebuginfo::Packed));
|
||||
tracked!(symbol_mangling_version, Some(SymbolManglingVersion::V0));
|
||||
|
@ -822,7 +823,6 @@ fn test_unstable_options_tracking_hash() {
|
|||
tracked!(profile_sample_use, Some(PathBuf::from("abc")));
|
||||
tracked!(profiler_runtime, "abc".to_string());
|
||||
tracked!(relax_elf_relocations, Some(true));
|
||||
tracked!(relro_level, Some(RelroLevel::Full));
|
||||
tracked!(remap_cwd_prefix, Some(PathBuf::from("abc")));
|
||||
tracked!(sanitizer, SanitizerSet::ADDRESS);
|
||||
tracked!(sanitizer_cfi_canonical_jump_tables, None);
|
||||
|
|
|
@ -102,4 +102,10 @@ declare_hooks! {
|
|||
/// turn a deserialized `DefPathHash` into its current `DefId`.
|
||||
/// Will fetch a DefId from a DefPathHash for a foreign crate.
|
||||
hook def_path_hash_to_def_id_extern(hash: DefPathHash, stable_crate_id: StableCrateId) -> DefId;
|
||||
|
||||
/// Create a THIR tree for debugging.
|
||||
hook thir_tree(key: LocalDefId) -> String;
|
||||
|
||||
/// Create a list-like THIR representation for debugging.
|
||||
hook thir_flat(key: LocalDefId) -> String;
|
||||
}
|
||||
|
|
|
@ -1823,9 +1823,7 @@ mod size_asserts {
|
|||
static_assert_size!(LocalDecl<'_>, 40);
|
||||
static_assert_size!(SourceScopeData<'_>, 64);
|
||||
static_assert_size!(Statement<'_>, 32);
|
||||
static_assert_size!(StatementKind<'_>, 16);
|
||||
static_assert_size!(Terminator<'_>, 112);
|
||||
static_assert_size!(TerminatorKind<'_>, 96);
|
||||
static_assert_size!(VarDebugInfo<'_>, 88);
|
||||
// tidy-alphabetical-end
|
||||
}
|
||||
|
|
|
@ -1463,5 +1463,6 @@ mod size_asserts {
|
|||
static_assert_size!(PlaceElem<'_>, 24);
|
||||
static_assert_size!(Rvalue<'_>, 40);
|
||||
static_assert_size!(StatementKind<'_>, 16);
|
||||
static_assert_size!(TerminatorKind<'_>, 96);
|
||||
// tidy-alphabetical-end
|
||||
}
|
||||
|
|
|
@ -474,20 +474,6 @@ rustc_queries! {
|
|||
desc { |tcx| "building THIR for `{}`", tcx.def_path_str(key) }
|
||||
}
|
||||
|
||||
/// Create a THIR tree for debugging.
|
||||
query thir_tree(key: LocalDefId) -> &'tcx String {
|
||||
no_hash
|
||||
arena_cache
|
||||
desc { |tcx| "constructing THIR tree for `{}`", tcx.def_path_str(key) }
|
||||
}
|
||||
|
||||
/// Create a list-like THIR representation for debugging.
|
||||
query thir_flat(key: LocalDefId) -> &'tcx String {
|
||||
no_hash
|
||||
arena_cache
|
||||
desc { |tcx| "constructing flat THIR representation for `{}`", tcx.def_path_str(key) }
|
||||
}
|
||||
|
||||
/// Set of all the `DefId`s in this crate that have MIR associated with
|
||||
/// them. This includes all the body owners, but also things like struct
|
||||
/// constructors.
|
||||
|
|
|
@ -34,6 +34,6 @@ pub fn provide(providers: &mut Providers) {
|
|||
build::closure_saved_names_of_captured_variables;
|
||||
providers.check_unsafety = check_unsafety::check_unsafety;
|
||||
providers.thir_body = thir::cx::thir_body;
|
||||
providers.thir_tree = thir::print::thir_tree;
|
||||
providers.thir_flat = thir::print::thir_flat;
|
||||
providers.hooks.thir_tree = thir::print::thir_tree;
|
||||
providers.hooks.thir_flat = thir::print::thir_flat;
|
||||
}
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
use rustc_middle::query::TyCtxtAt;
|
||||
use rustc_middle::thir::*;
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
use rustc_middle::ty;
|
||||
use rustc_span::def_id::LocalDefId;
|
||||
use std::fmt::{self, Write};
|
||||
|
||||
pub(crate) fn thir_tree(tcx: TyCtxt<'_>, owner_def: LocalDefId) -> String {
|
||||
match super::cx::thir_body(tcx, owner_def) {
|
||||
pub(crate) fn thir_tree(tcx: TyCtxtAt<'_>, owner_def: LocalDefId) -> String {
|
||||
match super::cx::thir_body(*tcx, owner_def) {
|
||||
Ok((thir, _)) => {
|
||||
let thir = thir.steal();
|
||||
let mut printer = ThirPrinter::new(&thir);
|
||||
|
@ -15,8 +16,8 @@ pub(crate) fn thir_tree(tcx: TyCtxt<'_>, owner_def: LocalDefId) -> String {
|
|||
}
|
||||
}
|
||||
|
||||
pub(crate) fn thir_flat(tcx: TyCtxt<'_>, owner_def: LocalDefId) -> String {
|
||||
match super::cx::thir_body(tcx, owner_def) {
|
||||
pub(crate) fn thir_flat(tcx: TyCtxtAt<'_>, owner_def: LocalDefId) -> String {
|
||||
match super::cx::thir_body(*tcx, owner_def) {
|
||||
Ok((thir, _)) => format!("{:#?}", thir.steal()),
|
||||
Err(_) => "error".into(),
|
||||
}
|
||||
|
|
|
@ -1534,6 +1534,8 @@ options! {
|
|||
relocation_model: Option<RelocModel> = (None, parse_relocation_model, [TRACKED],
|
||||
"control generation of position-independent code (PIC) \
|
||||
(`rustc --print relocation-models` for details)"),
|
||||
relro_level: Option<RelroLevel> = (None, parse_relro_level, [TRACKED],
|
||||
"choose which RELRO level to use"),
|
||||
remark: Passes = (Passes::Some(Vec::new()), parse_passes, [UNTRACKED],
|
||||
"output remarks for these optimization passes (space separated, or \"all\")"),
|
||||
rpath: bool = (false, parse_bool, [UNTRACKED],
|
||||
|
@ -1881,8 +1883,6 @@ options! {
|
|||
"randomize the layout of types (default: no)"),
|
||||
relax_elf_relocations: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||
"whether ELF relocations can be relaxed"),
|
||||
relro_level: Option<RelroLevel> = (None, parse_relro_level, [TRACKED],
|
||||
"choose which RELRO level to use"),
|
||||
remap_cwd_prefix: Option<PathBuf> = (None, parse_opt_pathbuf, [TRACKED],
|
||||
"remap paths under the current working directory to this path prefix"),
|
||||
remap_path_scope: RemapPathScopeComponents = (RemapPathScopeComponents::all(), parse_remap_path_scope, [TRACKED],
|
||||
|
|
|
@ -573,7 +573,7 @@ impl Session {
|
|||
|
||||
let dbg_opts = &self.opts.unstable_opts;
|
||||
|
||||
let relro_level = dbg_opts.relro_level.unwrap_or(self.target.relro_level);
|
||||
let relro_level = self.opts.cg.relro_level.unwrap_or(self.target.relro_level);
|
||||
|
||||
// Only enable this optimization by default if full relro is also enabled.
|
||||
// In this case, lazy binding was already unavailable, so nothing is lost.
|
||||
|
|
|
@ -298,6 +298,7 @@ fn link_env_remove(os: &'static str) -> StaticCow<[StaticCow<str>]> {
|
|||
|| sdkroot.contains("WatchOS.platform")
|
||||
|| sdkroot.contains("WatchSimulator.platform")
|
||||
|| sdkroot.contains("XROS.platform")
|
||||
|| sdkroot.contains("XRSimulator.platform")
|
||||
{
|
||||
env_remove.push("SDKROOT".into())
|
||||
}
|
||||
|
|
|
@ -984,7 +984,10 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
|||
// Already reported in the query.
|
||||
SelectionError::NotConstEvaluatable(NotConstEvaluatable::Error(guar)) |
|
||||
// Already reported.
|
||||
Overflow(OverflowError::Error(guar)) => return guar,
|
||||
Overflow(OverflowError::Error(guar)) => {
|
||||
self.set_tainted_by_errors(guar);
|
||||
return guar
|
||||
},
|
||||
|
||||
Overflow(_) => {
|
||||
bug!("overflow should be handled before the `report_selection_error` path");
|
||||
|
|
|
@ -87,6 +87,14 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
} else if lang_items.sized_trait() == Some(def_id) {
|
||||
// Sized is never implementable by end-users, it is
|
||||
// always automatically computed.
|
||||
|
||||
// FIXME: Consider moving this check to the top level as it
|
||||
// may also be useful for predicates other than `Sized`
|
||||
// Error type cannot possibly implement `Sized` (fixes #123154)
|
||||
if let Err(e) = obligation.predicate.skip_binder().self_ty().error_reported() {
|
||||
return Err(SelectionError::Overflow(e.into()));
|
||||
}
|
||||
|
||||
let sized_conditions = self.sized_conditions(obligation);
|
||||
self.assemble_builtin_bound_candidates(sized_conditions, &mut candidates);
|
||||
} else if lang_items.unsize_trait() == Some(def_id) {
|
||||
|
|
|
@ -91,8 +91,8 @@ fn adt_sized_constraint<'tcx>(
|
|||
let tail_ty = tcx.type_of(tail_def.did).instantiate_identity();
|
||||
|
||||
let constraint_ty = sized_constraint_for_ty(tcx, tail_ty)?;
|
||||
if constraint_ty.references_error() {
|
||||
return None;
|
||||
if let Err(guar) = constraint_ty.error_reported() {
|
||||
return Some(ty::EarlyBinder::bind(Ty::new_error(tcx, guar)));
|
||||
}
|
||||
|
||||
// perf hack: if there is a `constraint_ty: Sized` bound, then we know
|
||||
|
|
|
@ -346,6 +346,11 @@ impl UniverseIndex {
|
|||
pub fn cannot_name(self, other: UniverseIndex) -> bool {
|
||||
self < other
|
||||
}
|
||||
|
||||
/// Returns `true` if `self` is the root universe, otherwise false.
|
||||
pub fn is_root(self) -> bool {
|
||||
self == Self::ROOT
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for UniverseIndex {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue