Restrict bevy hack
This commit is contained in:
parent
f44efbf9e1
commit
b02eac37ff
4 changed files with 37 additions and 28 deletions
|
@ -16,7 +16,6 @@ use rustc_lint_defs::builtin::SUPERTRAIT_ITEM_SHADOWING_DEFINITION;
|
||||||
use rustc_macros::LintDiagnostic;
|
use rustc_macros::LintDiagnostic;
|
||||||
use rustc_middle::mir::interpret::ErrorHandled;
|
use rustc_middle::mir::interpret::ErrorHandled;
|
||||||
use rustc_middle::query::Providers;
|
use rustc_middle::query::Providers;
|
||||||
use rustc_middle::ty::print::with_no_trimmed_paths;
|
|
||||||
use rustc_middle::ty::trait_def::TraitSpecializationKind;
|
use rustc_middle::ty::trait_def::TraitSpecializationKind;
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, AdtKind, GenericArgKind, GenericArgs, GenericParamDefKind, Ty, TyCtxt, TypeFoldable,
|
self, AdtKind, GenericArgKind, GenericArgs, GenericParamDefKind, Ty, TyCtxt, TypeFoldable,
|
||||||
|
@ -143,33 +142,7 @@ where
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let is_bevy = 'is_bevy: {
|
let is_bevy = assumed_wf_types.visit_with(&mut ContainsBevyParamSet { tcx }).is_break();
|
||||||
// We don't want to emit this for dependents of Bevy, for now.
|
|
||||||
// See #119956
|
|
||||||
let is_bevy_paramset = |def: ty::AdtDef<'_>| {
|
|
||||||
let adt_did = with_no_trimmed_paths!(infcx.tcx.def_path_str(def.0.did));
|
|
||||||
adt_did.contains("ParamSet")
|
|
||||||
};
|
|
||||||
for ty in assumed_wf_types.iter() {
|
|
||||||
match ty.kind() {
|
|
||||||
ty::Adt(def, _) => {
|
|
||||||
if is_bevy_paramset(*def) {
|
|
||||||
break 'is_bevy true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ty::Ref(_, ty, _) => match ty.kind() {
|
|
||||||
ty::Adt(def, _) => {
|
|
||||||
if is_bevy_paramset(*def) {
|
|
||||||
break 'is_bevy true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
},
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
false
|
|
||||||
};
|
|
||||||
|
|
||||||
// If we have set `no_implied_bounds_compat`, then do not attempt compatibility.
|
// If we have set `no_implied_bounds_compat`, then do not attempt compatibility.
|
||||||
// We could also just always enter if `is_bevy`, and call `implied_bounds_tys`,
|
// We could also just always enter if `is_bevy`, and call `implied_bounds_tys`,
|
||||||
|
@ -194,6 +167,31 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ContainsBevyParamSet<'tcx> {
|
||||||
|
tcx: TyCtxt<'tcx>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for ContainsBevyParamSet<'tcx> {
|
||||||
|
type Result = ControlFlow<()>;
|
||||||
|
|
||||||
|
fn visit_ty(&mut self, t: Ty<'tcx>) -> Self::Result {
|
||||||
|
// We only care to match `ParamSet<T>` or `&ParamSet<T>`.
|
||||||
|
match t.kind() {
|
||||||
|
ty::Adt(def, _) => {
|
||||||
|
if self.tcx.item_name(def.did()) == sym::ParamSet
|
||||||
|
&& self.tcx.crate_name(def.did().krate) == sym::bevy_ecs
|
||||||
|
{
|
||||||
|
return ControlFlow::Break(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ty::Ref(_, ty, _) => ty.visit_with(self)?,
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
|
||||||
|
ControlFlow::Continue(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn check_well_formed(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(), ErrorGuaranteed> {
|
fn check_well_formed(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Result<(), ErrorGuaranteed> {
|
||||||
let node = tcx.hir_node_by_def_id(def_id);
|
let node = tcx.hir_node_by_def_id(def_id);
|
||||||
let mut res = match node {
|
let mut res = match node {
|
||||||
|
|
|
@ -289,6 +289,7 @@ symbols! {
|
||||||
OsString,
|
OsString,
|
||||||
Output,
|
Output,
|
||||||
Param,
|
Param,
|
||||||
|
ParamSet,
|
||||||
PartialEq,
|
PartialEq,
|
||||||
PartialOrd,
|
PartialOrd,
|
||||||
Path,
|
Path,
|
||||||
|
@ -520,6 +521,7 @@ symbols! {
|
||||||
bang,
|
bang,
|
||||||
begin_panic,
|
begin_panic,
|
||||||
bench,
|
bench,
|
||||||
|
bevy_ecs,
|
||||||
bikeshed_guaranteed_no_drop,
|
bikeshed_guaranteed_no_drop,
|
||||||
bin,
|
bin,
|
||||||
binaryheap_iter,
|
binaryheap_iter,
|
||||||
|
|
|
@ -224,6 +224,13 @@ impl<I: Interner, T: TypeVisitable<I>, Ix: Idx> TypeVisitable<I> for IndexVec<Ix
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<I: Interner, T: TypeVisitable<I>, S> TypeVisitable<I> for indexmap::IndexSet<T, S> {
|
||||||
|
fn visit_with<V: TypeVisitor<I>>(&self, visitor: &mut V) -> V::Result {
|
||||||
|
walk_visitable_list!(visitor, self.iter());
|
||||||
|
V::Result::output()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub trait Flags {
|
pub trait Flags {
|
||||||
fn flags(&self) -> TypeFlags;
|
fn flags(&self) -> TypeFlags;
|
||||||
fn outer_exclusive_binder(&self) -> ty::DebruijnIndex;
|
fn outer_exclusive_binder(&self) -> ty::DebruijnIndex;
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#![crate_name = "bevy_ecs"]
|
||||||
|
|
||||||
//@ check-pass
|
//@ check-pass
|
||||||
|
|
||||||
// We currently special case bevy from erroring on incorrect implied bounds
|
// We currently special case bevy from erroring on incorrect implied bounds
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue