Auto merge of #139881 - matthiaskrgr:rollup-7x6zcrc, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #138455 (`librustdoc`: more `impl fmt::Display`) - #139818 (Normalize ADT field in `find_tails_for_unsizing`) - #139819 (Use `rust-cache` to speed-up `citool` compilation) - #139824 (Remove safe remove) - #139848 ( Reduce kw::Empty usage, part 5) - #139859 (CI: rename MacOS runner) - #139877 (Add warning comment to `Take::get_ref` and `Chain::get_ref`) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
38c560ae68
17 changed files with 330 additions and 356 deletions
|
@ -1765,7 +1765,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
ident: Ident,
|
||||
is_anon_in_path: IsAnonInPath,
|
||||
) -> &'hir hir::Lifetime {
|
||||
debug_assert_ne!(ident.name, kw::Empty);
|
||||
let res = self.resolver.get_lifetime_res(id).unwrap_or(LifetimeRes::Error);
|
||||
let res = match res {
|
||||
LifetimeRes::Param { param, .. } => hir::LifetimeName::Param(param),
|
||||
|
|
|
@ -1600,11 +1600,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
Ok(method)
|
||||
}
|
||||
Err(error) => {
|
||||
if segment.ident.name == kw::Empty {
|
||||
span_bug!(rcvr.span, "empty method name")
|
||||
} else {
|
||||
Err(self.report_method_error(expr.hir_id, rcvr_t, error, expected, false))
|
||||
}
|
||||
Err(self.report_method_error(expr.hir_id, rcvr_t, error, expected, false))
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -2941,9 +2937,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
return Ty::new_error(self.tcx(), guar);
|
||||
}
|
||||
|
||||
let guar = if field.name == kw::Empty {
|
||||
self.dcx().span_bug(field.span, "field name with no name")
|
||||
} else if self.method_exists_for_diagnostic(
|
||||
let guar = if self.method_exists_for_diagnostic(
|
||||
field,
|
||||
base_ty,
|
||||
expr.hir_id,
|
||||
|
|
|
@ -27,9 +27,9 @@ use rustc_middle::ty::{
|
|||
};
|
||||
use rustc_middle::{bug, span_bug};
|
||||
use rustc_session::lint;
|
||||
use rustc_span::Span;
|
||||
use rustc_span::def_id::LocalDefId;
|
||||
use rustc_span::hygiene::DesugaringKind;
|
||||
use rustc_span::{Span, kw};
|
||||
use rustc_trait_selection::error_reporting::infer::need_type_info::TypeAnnotationNeeded;
|
||||
use rustc_trait_selection::traits::{
|
||||
self, NormalizeExt, ObligationCauseCode, StructurallyNormalizeExt,
|
||||
|
@ -833,7 +833,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
|
||||
let trait_missing_method =
|
||||
matches!(error, method::MethodError::NoMatch(_)) && ty.normalized.is_trait();
|
||||
assert_ne!(item_name.name, kw::Empty);
|
||||
self.report_method_error(
|
||||
hir_id,
|
||||
ty.normalized,
|
||||
|
|
|
@ -290,7 +290,7 @@ pub(crate) fn prepare_session_directory(sess: &Session, crate_name: Symbol) {
|
|||
|
||||
// Try to remove the session directory we just allocated. We don't
|
||||
// know if there's any garbage in it from the failed copy action.
|
||||
if let Err(err) = safe_remove_dir_all(&session_dir) {
|
||||
if let Err(err) = std_fs::remove_dir_all(&session_dir) {
|
||||
sess.dcx().emit_warn(errors::DeletePartial { path: &session_dir, err });
|
||||
}
|
||||
|
||||
|
@ -324,7 +324,7 @@ pub fn finalize_session_directory(sess: &Session, svh: Option<Svh>) {
|
|||
incr_comp_session_dir.display()
|
||||
);
|
||||
|
||||
if let Err(err) = safe_remove_dir_all(&*incr_comp_session_dir) {
|
||||
if let Err(err) = std_fs::remove_dir_all(&*incr_comp_session_dir) {
|
||||
sess.dcx().emit_warn(errors::DeleteFull { path: &incr_comp_session_dir, err });
|
||||
}
|
||||
|
||||
|
@ -715,7 +715,7 @@ pub(crate) fn garbage_collect_session_directories(sess: &Session) -> io::Result<
|
|||
for directory_name in session_directories {
|
||||
if !lock_file_to_session_dir.items().any(|(_, dir)| *dir == directory_name) {
|
||||
let path = crate_directory.join(directory_name);
|
||||
if let Err(err) = safe_remove_dir_all(&path) {
|
||||
if let Err(err) = std_fs::remove_dir_all(&path) {
|
||||
sess.dcx().emit_warn(errors::InvalidGcFailed { path: &path, err });
|
||||
}
|
||||
}
|
||||
|
@ -821,7 +821,7 @@ pub(crate) fn garbage_collect_session_directories(sess: &Session) -> io::Result<
|
|||
all_except_most_recent(deletion_candidates).into_items().all(|(path, lock)| {
|
||||
debug!("garbage_collect_session_directories() - deleting `{}`", path.display());
|
||||
|
||||
if let Err(err) = safe_remove_dir_all(&path) {
|
||||
if let Err(err) = std_fs::remove_dir_all(&path) {
|
||||
sess.dcx().emit_warn(errors::FinalizedGcFailed { path: &path, err });
|
||||
} else {
|
||||
delete_session_dir_lock_file(sess, &lock_file_path(&path));
|
||||
|
@ -839,7 +839,7 @@ pub(crate) fn garbage_collect_session_directories(sess: &Session) -> io::Result<
|
|||
fn delete_old(sess: &Session, path: &Path) {
|
||||
debug!("garbage_collect_session_directories() - deleting `{}`", path.display());
|
||||
|
||||
if let Err(err) = safe_remove_dir_all(path) {
|
||||
if let Err(err) = std_fs::remove_dir_all(path) {
|
||||
sess.dcx().emit_warn(errors::SessionGcFailed { path, err });
|
||||
} else {
|
||||
delete_session_dir_lock_file(sess, &lock_file_path(path));
|
||||
|
@ -862,30 +862,8 @@ fn all_except_most_recent(
|
|||
}
|
||||
}
|
||||
|
||||
/// Since paths of artifacts within session directories can get quite long, we
|
||||
/// need to support deleting files with very long paths. The regular
|
||||
/// WinApi functions only support paths up to 260 characters, however. In order
|
||||
/// to circumvent this limitation, we canonicalize the path of the directory
|
||||
/// before passing it to std::fs::remove_dir_all(). This will convert the path
|
||||
/// into the '\\?\' format, which supports much longer paths.
|
||||
fn safe_remove_dir_all(p: &Path) -> io::Result<()> {
|
||||
let canonicalized = match try_canonicalize(p) {
|
||||
Ok(canonicalized) => canonicalized,
|
||||
Err(err) if err.kind() == io::ErrorKind::NotFound => return Ok(()),
|
||||
Err(err) => return Err(err),
|
||||
};
|
||||
|
||||
std_fs::remove_dir_all(canonicalized)
|
||||
}
|
||||
|
||||
fn safe_remove_file(p: &Path) -> io::Result<()> {
|
||||
let canonicalized = match try_canonicalize(p) {
|
||||
Ok(canonicalized) => canonicalized,
|
||||
Err(err) if err.kind() == io::ErrorKind::NotFound => return Ok(()),
|
||||
Err(err) => return Err(err),
|
||||
};
|
||||
|
||||
match std_fs::remove_file(canonicalized) {
|
||||
match std_fs::remove_file(p) {
|
||||
Err(err) if err.kind() == io::ErrorKind::NotFound => Ok(()),
|
||||
result => result,
|
||||
}
|
||||
|
|
|
@ -688,7 +688,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirUsedCollector<'a, 'tcx> {
|
|||
let target_ty = self.monomorphize(target_ty);
|
||||
let source_ty = self.monomorphize(source_ty);
|
||||
let (source_ty, target_ty) =
|
||||
find_vtable_types_for_unsizing(self.tcx.at(span), source_ty, target_ty);
|
||||
find_tails_for_unsizing(self.tcx.at(span), source_ty, target_ty);
|
||||
// This could also be a different Unsize instruction, like
|
||||
// from a fixed sized array to a slice. But we are only
|
||||
// interested in things that produce a vtable.
|
||||
|
@ -1037,36 +1037,35 @@ fn should_codegen_locally<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) ->
|
|||
///
|
||||
/// Finally, there is also the case of custom unsizing coercions, e.g., for
|
||||
/// smart pointers such as `Rc` and `Arc`.
|
||||
fn find_vtable_types_for_unsizing<'tcx>(
|
||||
fn find_tails_for_unsizing<'tcx>(
|
||||
tcx: TyCtxtAt<'tcx>,
|
||||
source_ty: Ty<'tcx>,
|
||||
target_ty: Ty<'tcx>,
|
||||
) -> (Ty<'tcx>, Ty<'tcx>) {
|
||||
let ptr_vtable = |inner_source: Ty<'tcx>, inner_target: Ty<'tcx>| {
|
||||
let typing_env = ty::TypingEnv::fully_monomorphized();
|
||||
if tcx.type_has_metadata(inner_source, typing_env) {
|
||||
(inner_source, inner_target)
|
||||
} else {
|
||||
tcx.struct_lockstep_tails_for_codegen(inner_source, inner_target, typing_env)
|
||||
}
|
||||
};
|
||||
let typing_env = ty::TypingEnv::fully_monomorphized();
|
||||
debug_assert!(!source_ty.has_param(), "{source_ty} should be fully monomorphic");
|
||||
debug_assert!(!target_ty.has_param(), "{target_ty} should be fully monomorphic");
|
||||
|
||||
match (source_ty.kind(), target_ty.kind()) {
|
||||
(&ty::Ref(_, a, _), &ty::Ref(_, b, _) | &ty::RawPtr(b, _))
|
||||
| (&ty::RawPtr(a, _), &ty::RawPtr(b, _)) => ptr_vtable(a, b),
|
||||
(
|
||||
&ty::Ref(_, source_pointee, _),
|
||||
&ty::Ref(_, target_pointee, _) | &ty::RawPtr(target_pointee, _),
|
||||
)
|
||||
| (&ty::RawPtr(source_pointee, _), &ty::RawPtr(target_pointee, _)) => {
|
||||
tcx.struct_lockstep_tails_for_codegen(source_pointee, target_pointee, typing_env)
|
||||
}
|
||||
|
||||
// `Box<T>` could go through the ADT code below, b/c it'll unpeel to `Unique<T>`,
|
||||
// and eventually bottom out in a raw ref, but we can micro-optimize it here.
|
||||
(_, _)
|
||||
if let Some(source_boxed) = source_ty.boxed_ty()
|
||||
&& let Some(target_boxed) = target_ty.boxed_ty() =>
|
||||
{
|
||||
ptr_vtable(source_boxed, target_boxed)
|
||||
tcx.struct_lockstep_tails_for_codegen(source_boxed, target_boxed, typing_env)
|
||||
}
|
||||
|
||||
// T as dyn* Trait
|
||||
(_, &ty::Dynamic(_, _, ty::DynStar)) => ptr_vtable(source_ty, target_ty),
|
||||
|
||||
(&ty::Adt(source_adt_def, source_args), &ty::Adt(target_adt_def, target_args)) => {
|
||||
assert_eq!(source_adt_def, target_adt_def);
|
||||
|
||||
let CustomCoerceUnsized::Struct(coerce_index) =
|
||||
match crate::custom_coerce_unsize_info(tcx, source_ty, target_ty) {
|
||||
Ok(ccu) => ccu,
|
||||
|
@ -1075,21 +1074,23 @@ fn find_vtable_types_for_unsizing<'tcx>(
|
|||
return (e, e);
|
||||
}
|
||||
};
|
||||
|
||||
let source_fields = &source_adt_def.non_enum_variant().fields;
|
||||
let target_fields = &target_adt_def.non_enum_variant().fields;
|
||||
|
||||
assert!(
|
||||
coerce_index.index() < source_fields.len()
|
||||
&& source_fields.len() == target_fields.len()
|
||||
);
|
||||
|
||||
find_vtable_types_for_unsizing(
|
||||
tcx,
|
||||
source_fields[coerce_index].ty(*tcx, source_args),
|
||||
target_fields[coerce_index].ty(*tcx, target_args),
|
||||
)
|
||||
let coerce_field = &source_adt_def.non_enum_variant().fields[coerce_index];
|
||||
// We're getting a possibly unnormalized type, so normalize it.
|
||||
let source_field =
|
||||
tcx.normalize_erasing_regions(typing_env, coerce_field.ty(*tcx, source_args));
|
||||
let target_field =
|
||||
tcx.normalize_erasing_regions(typing_env, coerce_field.ty(*tcx, target_args));
|
||||
find_tails_for_unsizing(tcx, source_field, target_field)
|
||||
}
|
||||
|
||||
// `T` as `dyn* Trait` unsizes *directly*.
|
||||
//
|
||||
// FIXME(dyn_star): This case is a bit awkward, b/c we're not really computing
|
||||
// a tail here. We probably should handle this separately in the *caller* of
|
||||
// this function, rather than returning something that is semantically different
|
||||
// than what we return above.
|
||||
(_, &ty::Dynamic(_, _, ty::DynStar)) => (source_ty, target_ty),
|
||||
|
||||
_ => bug!(
|
||||
"find_vtable_types_for_unsizing: invalid coercion {:?} -> {:?}",
|
||||
source_ty,
|
||||
|
@ -1308,7 +1309,7 @@ fn visit_mentioned_item<'tcx>(
|
|||
}
|
||||
MentionedItem::UnsizeCast { source_ty, target_ty } => {
|
||||
let (source_ty, target_ty) =
|
||||
find_vtable_types_for_unsizing(tcx.at(span), source_ty, target_ty);
|
||||
find_tails_for_unsizing(tcx.at(span), source_ty, target_ty);
|
||||
// This could also be a different Unsize instruction, like
|
||||
// from a fixed sized array to a slice. But we are only
|
||||
// interested in things that produce a vtable.
|
||||
|
|
|
@ -1012,7 +1012,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||
// HACK(eddyb) `lint_if_path_starts_with_module` needs at least
|
||||
// 2 segments, so the `resolve_path` above won't trigger it.
|
||||
let mut full_path = import.module_path.clone();
|
||||
full_path.push(Segment::from_ident(Ident::empty()));
|
||||
full_path.push(Segment::from_ident(Ident::dummy()));
|
||||
self.lint_if_path_starts_with_module(Some(finalize), &full_path, None);
|
||||
}
|
||||
|
||||
|
|
|
@ -776,7 +776,7 @@ impl<'tcx> Printer<'tcx> for SymbolMangler<'tcx> {
|
|||
self.push_disambiguator(
|
||||
disambiguated_field.disambiguator as u64,
|
||||
);
|
||||
self.push_ident(field_name.unwrap_or(kw::Empty).as_str());
|
||||
self.push_ident(field_name.unwrap().as_str());
|
||||
|
||||
field.print(self)?;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue