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_middle::mir::interpret::ErrorHandled;
|
||||
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::{
|
||||
self, AdtKind, GenericArgKind, GenericArgs, GenericParamDefKind, Ty, TyCtxt, TypeFoldable,
|
||||
|
@ -143,33 +142,7 @@ where
|
|||
return Ok(());
|
||||
}
|
||||
|
||||
let is_bevy = 'is_bevy: {
|
||||
// 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
|
||||
};
|
||||
let is_bevy = assumed_wf_types.visit_with(&mut ContainsBevyParamSet { tcx }).is_break();
|
||||
|
||||
// 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`,
|
||||
|
@ -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> {
|
||||
let node = tcx.hir_node_by_def_id(def_id);
|
||||
let mut res = match node {
|
||||
|
|
|
@ -289,6 +289,7 @@ symbols! {
|
|||
OsString,
|
||||
Output,
|
||||
Param,
|
||||
ParamSet,
|
||||
PartialEq,
|
||||
PartialOrd,
|
||||
Path,
|
||||
|
@ -520,6 +521,7 @@ symbols! {
|
|||
bang,
|
||||
begin_panic,
|
||||
bench,
|
||||
bevy_ecs,
|
||||
bikeshed_guaranteed_no_drop,
|
||||
bin,
|
||||
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 {
|
||||
fn flags(&self) -> TypeFlags;
|
||||
fn outer_exclusive_binder(&self) -> ty::DebruijnIndex;
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
#![crate_name = "bevy_ecs"]
|
||||
|
||||
//@ check-pass
|
||||
|
||||
// We currently special case bevy from erroring on incorrect implied bounds
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue