Rollup merge of #130826 - fmease:compiler-mv-obj-safe-dyn-compat, r=compiler-errors
Compiler: Rename "object safe" to "dyn compatible" Completed T-lang FCP: https://github.com/rust-lang/lang-team/issues/286#issuecomment-2338905118. Tracking issue: https://github.com/rust-lang/rust/issues/130852 Excludes `compiler/rustc_codegen_cranelift` (to be filed separately). Includes Stable MIR. Regarding https://github.com/rust-lang/rust/labels/relnotes, I guess I will manually open a https://github.com/rust-lang/rust/labels/relnotes-tracking-issue since this change affects everything (compiler, library, tools, docs, books, everyday language). r? ghost
This commit is contained in:
commit
a935064fae
183 changed files with 523 additions and 510 deletions
|
@ -374,7 +374,7 @@ fn check_trait_item<'tcx>(
|
|||
hir::TraitItemKind::Type(_bounds, Some(ty)) => (None, ty.span),
|
||||
_ => (None, trait_item.span),
|
||||
};
|
||||
check_object_unsafe_self_trait_by_name(tcx, trait_item);
|
||||
check_dyn_incompatible_self_trait_by_name(tcx, trait_item);
|
||||
let mut res = check_associated_item(tcx, def_id, span, method_sig);
|
||||
|
||||
if matches!(trait_item.kind, hir::TraitItemKind::Fn(..)) {
|
||||
|
@ -838,9 +838,10 @@ fn could_be_self(trait_def_id: LocalDefId, ty: &hir::Ty<'_>) -> bool {
|
|||
}
|
||||
}
|
||||
|
||||
/// Detect when an object unsafe trait is referring to itself in one of its associated items.
|
||||
/// When this is done, suggest using `Self` instead.
|
||||
fn check_object_unsafe_self_trait_by_name(tcx: TyCtxt<'_>, item: &hir::TraitItem<'_>) {
|
||||
/// Detect when a dyn-incompatible trait is referring to itself in one of its associated items.
|
||||
///
|
||||
/// In such cases, suggest using `Self` instead.
|
||||
fn check_dyn_incompatible_self_trait_by_name(tcx: TyCtxt<'_>, item: &hir::TraitItem<'_>) {
|
||||
let (trait_name, trait_def_id) =
|
||||
match tcx.hir_node_by_def_id(tcx.hir().get_parent_item(item.hir_id()).def_id) {
|
||||
hir::Node::Item(item) => match item.kind {
|
||||
|
@ -872,7 +873,7 @@ fn check_object_unsafe_self_trait_by_name(tcx: TyCtxt<'_>, item: &hir::TraitItem
|
|||
_ => {}
|
||||
}
|
||||
if !trait_should_be_self.is_empty() {
|
||||
if tcx.is_object_safe(trait_def_id) {
|
||||
if tcx.is_dyn_compatible(trait_def_id) {
|
||||
return;
|
||||
}
|
||||
let sugg = trait_should_be_self.iter().map(|span| (*span, "Self".to_string())).collect();
|
||||
|
|
|
@ -183,8 +183,8 @@ fn check_object_overlap<'tcx>(
|
|||
|
||||
// check for overlap with the automatic `impl Trait for dyn Trait`
|
||||
if let ty::Dynamic(data, ..) = trait_ref.self_ty().kind() {
|
||||
// This is something like impl Trait1 for Trait2. Illegal
|
||||
// if Trait1 is a supertrait of Trait2 or Trait2 is not object safe.
|
||||
// This is something like `impl Trait1 for Trait2`. Illegal if
|
||||
// Trait1 is a supertrait of Trait2 or Trait2 is not dyn-compatible.
|
||||
|
||||
let component_def_ids = data.iter().flat_map(|predicate| {
|
||||
match predicate.skip_binder() {
|
||||
|
@ -197,7 +197,8 @@ fn check_object_overlap<'tcx>(
|
|||
});
|
||||
|
||||
for component_def_id in component_def_ids {
|
||||
if !tcx.is_object_safe(component_def_id) {
|
||||
if !tcx.is_dyn_compatible(component_def_id) {
|
||||
// FIXME(dyn_compat_renaming): Rename test and update comment.
|
||||
// Without the 'object_safe_for_dispatch' feature this is an error
|
||||
// which will be reported by wfcheck. Ignore it here.
|
||||
// This is tested by `coherence-impl-trait-for-trait-object-safe.rs`.
|
||||
|
|
|
@ -109,16 +109,16 @@ pub(crate) fn orphan_check_impl(
|
|||
//
|
||||
// auto trait AutoTrait {}
|
||||
//
|
||||
// trait ObjectSafeTrait {
|
||||
// trait DynCompatibleTrait {
|
||||
// fn f(&self) where Self: AutoTrait;
|
||||
// }
|
||||
//
|
||||
// We can allow f to be called on `dyn ObjectSafeTrait + AutoTrait`.
|
||||
// We can allow f to be called on `dyn DynCompatibleTrait + AutoTrait`.
|
||||
//
|
||||
// If we didn't deny `impl AutoTrait for dyn Trait`, it would be unsound
|
||||
// for the ObjectSafeTrait shown above to be object safe because someone
|
||||
// could take some type implementing ObjectSafeTrait but not AutoTrait,
|
||||
// unsize it to `dyn ObjectSafeTrait`, and call .f() which has no
|
||||
// for the `DynCompatibleTrait` shown above to be dyn-compatible because someone
|
||||
// could take some type implementing `DynCompatibleTrait` but not `AutoTrait`,
|
||||
// unsize it to `dyn DynCompatibleTrait`, and call `.f()` which has no
|
||||
// concrete implementation (issue #50781).
|
||||
enum LocalImpl {
|
||||
Allow,
|
||||
|
|
|
@ -11,8 +11,8 @@ use rustc_middle::ty::{
|
|||
self, DynKind, ExistentialPredicateStableCmpExt as _, Ty, TyCtxt, TypeFoldable, Upcast,
|
||||
};
|
||||
use rustc_span::{ErrorGuaranteed, Span};
|
||||
use rustc_trait_selection::error_reporting::traits::report_object_safety_error;
|
||||
use rustc_trait_selection::traits::{self, hir_ty_lowering_object_safety_violations};
|
||||
use rustc_trait_selection::error_reporting::traits::report_dyn_incompatibility;
|
||||
use rustc_trait_selection::traits::{self, hir_ty_lowering_dyn_compatibility_violations};
|
||||
use smallvec::{SmallVec, smallvec};
|
||||
use tracing::{debug, instrument};
|
||||
|
||||
|
@ -99,19 +99,19 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
return Ty::new_error(tcx, reported);
|
||||
}
|
||||
|
||||
// Check that there are no gross object safety violations;
|
||||
// Check that there are no gross dyn-compatibility violations;
|
||||
// most importantly, that the supertraits don't contain `Self`,
|
||||
// to avoid ICEs.
|
||||
for item in ®ular_traits {
|
||||
let object_safety_violations =
|
||||
hir_ty_lowering_object_safety_violations(tcx, item.trait_ref().def_id());
|
||||
if !object_safety_violations.is_empty() {
|
||||
let reported = report_object_safety_error(
|
||||
let violations =
|
||||
hir_ty_lowering_dyn_compatibility_violations(tcx, item.trait_ref().def_id());
|
||||
if !violations.is_empty() {
|
||||
let reported = report_dyn_incompatibility(
|
||||
tcx,
|
||||
span,
|
||||
Some(hir_id),
|
||||
item.trait_ref().def_id(),
|
||||
&object_safety_violations,
|
||||
&violations,
|
||||
)
|
||||
.emit();
|
||||
return Ty::new_error(tcx, reported);
|
||||
|
@ -275,8 +275,10 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
tcx.item_name(def_id),
|
||||
)
|
||||
.with_note(
|
||||
rustc_middle::traits::ObjectSafetyViolation::SupertraitSelf(smallvec![])
|
||||
.error_msg(),
|
||||
rustc_middle::traits::DynCompatibilityViolation::SupertraitSelf(
|
||||
smallvec![],
|
||||
)
|
||||
.error_msg(),
|
||||
)
|
||||
.emit();
|
||||
}
|
|
@ -19,9 +19,9 @@ use rustc_session::parse::feature_err;
|
|||
use rustc_span::edit_distance::find_best_match_for_name;
|
||||
use rustc_span::symbol::{Ident, kw, sym};
|
||||
use rustc_span::{BytePos, DUMMY_SP, Span, Symbol};
|
||||
use rustc_trait_selection::error_reporting::traits::report_object_safety_error;
|
||||
use rustc_trait_selection::error_reporting::traits::report_dyn_incompatibility;
|
||||
use rustc_trait_selection::traits::{
|
||||
FulfillmentError, TraitAliasExpansionInfo, object_safety_violations_for_assoc_item,
|
||||
FulfillmentError, TraitAliasExpansionInfo, dyn_compatibility_violations_for_assoc_item,
|
||||
};
|
||||
|
||||
use crate::errors::{
|
||||
|
@ -739,7 +739,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
// Account for things like `dyn Foo + 'a`, like in tests `issue-22434.rs` and
|
||||
// `issue-22560.rs`.
|
||||
let mut trait_bound_spans: Vec<Span> = vec![];
|
||||
let mut object_safety_violations = false;
|
||||
let mut dyn_compatibility_violations = false;
|
||||
for (span, items) in &associated_types {
|
||||
if !items.is_empty() {
|
||||
trait_bound_spans.push(*span);
|
||||
|
@ -750,14 +750,14 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
names_len += 1;
|
||||
|
||||
let violations =
|
||||
object_safety_violations_for_assoc_item(tcx, trait_def_id, *assoc_item);
|
||||
dyn_compatibility_violations_for_assoc_item(tcx, trait_def_id, *assoc_item);
|
||||
if !violations.is_empty() {
|
||||
report_object_safety_error(tcx, *span, None, trait_def_id, &violations).emit();
|
||||
object_safety_violations = true;
|
||||
report_dyn_incompatibility(tcx, *span, None, trait_def_id, &violations).emit();
|
||||
dyn_compatibility_violations = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if object_safety_violations {
|
||||
if dyn_compatibility_violations {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
if self_ty.span.can_be_used_for_suggestions()
|
||||
&& !self.maybe_suggest_impl_trait(self_ty, &mut diag)
|
||||
{
|
||||
// FIXME: Only emit this suggestion if the trait is object safe.
|
||||
// FIXME: Only emit this suggestion if the trait is dyn-compatible.
|
||||
diag.multipart_suggestion_verbose(label, sugg, Applicability::MachineApplicable);
|
||||
}
|
||||
// Check if the impl trait that we are considering is an impl of a local trait.
|
||||
|
@ -89,7 +89,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
lint.primary_message("trait objects without an explicit `dyn` are deprecated");
|
||||
if self_ty.span.can_be_used_for_suggestions() {
|
||||
lint.multipart_suggestion_verbose(
|
||||
"if this is an object-safe trait, use `dyn`",
|
||||
"if this is a dyn-compatible trait, use `dyn`",
|
||||
sugg,
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
|
@ -196,7 +196,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
let mut is_downgradable = true;
|
||||
|
||||
// Check if trait object is safe for suggesting dynamic dispatch.
|
||||
let is_object_safe = match self_ty.kind {
|
||||
let is_dyn_compatible = match self_ty.kind {
|
||||
hir::TyKind::TraitObject(objects, ..) => {
|
||||
objects.iter().all(|(o, _)| match o.trait_ref.path.res {
|
||||
Res::Def(DefKind::Trait, id) => {
|
||||
|
@ -204,7 +204,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
// For recursive traits, don't downgrade the error. (#119652)
|
||||
is_downgradable = false;
|
||||
}
|
||||
tcx.is_object_safe(id)
|
||||
tcx.is_dyn_compatible(id)
|
||||
}
|
||||
_ => false,
|
||||
})
|
||||
|
@ -221,8 +221,8 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
if let hir::FnRetTy::Return(ty) = sig.decl.output
|
||||
&& ty.peel_refs().hir_id == self_ty.hir_id
|
||||
{
|
||||
let pre = if !is_object_safe {
|
||||
format!("`{trait_name}` is not object safe, ")
|
||||
let pre = if !is_dyn_compatible {
|
||||
format!("`{trait_name}` is dyn-incompatible, ")
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
|
@ -234,7 +234,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
diag.multipart_suggestion_verbose(msg, impl_sugg, Applicability::MachineApplicable);
|
||||
|
||||
// Suggest `Box<dyn Trait>` for return type
|
||||
if is_object_safe {
|
||||
if is_dyn_compatible {
|
||||
// If the return type is `&Trait`, we don't want
|
||||
// the ampersand to be displayed in the `Box<dyn Trait>`
|
||||
// suggestion.
|
||||
|
@ -253,7 +253,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
Applicability::MachineApplicable,
|
||||
);
|
||||
} else if is_downgradable {
|
||||
// We'll emit the object safety error already, with a structured suggestion.
|
||||
// We'll emit the dyn-compatibility error already, with a structured suggestion.
|
||||
diag.downgrade_to_delayed_bug();
|
||||
}
|
||||
return true;
|
||||
|
@ -276,10 +276,10 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
|||
impl_sugg,
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
if !is_object_safe {
|
||||
diag.note(format!("`{trait_name}` it is not object safe, so it can't be `dyn`"));
|
||||
if !is_dyn_compatible {
|
||||
diag.note(format!("`{trait_name}` it is dyn-incompatible, so it can't be `dyn`"));
|
||||
if is_downgradable {
|
||||
// We'll emit the object safety error already, with a structured suggestion.
|
||||
// We'll emit the dyn-compatibility error already, with a structured suggestion.
|
||||
diag.downgrade_to_delayed_bug();
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -15,10 +15,10 @@
|
|||
|
||||
mod bounds;
|
||||
mod cmse;
|
||||
mod dyn_compatibility;
|
||||
pub mod errors;
|
||||
pub mod generics;
|
||||
mod lint;
|
||||
mod object_safety;
|
||||
|
||||
use std::slice;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue