mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-30 08:30:45 +00:00
Make type_implements_trait not a query
This commit is contained in:
parent
26e57f05cc
commit
f0f3b3acf8
1 changed files with 8 additions and 6 deletions
|
@ -15,6 +15,7 @@ use rustc_span::sym;
|
||||||
use rustc_span::symbol::{Ident, Symbol};
|
use rustc_span::symbol::{Ident, Symbol};
|
||||||
use rustc_span::DUMMY_SP;
|
use rustc_span::DUMMY_SP;
|
||||||
use rustc_trait_selection::traits::query::normalize::AtExt;
|
use rustc_trait_selection::traits::query::normalize::AtExt;
|
||||||
|
use rustc_trait_selection::infer::InferCtxtExt;
|
||||||
|
|
||||||
use crate::{match_def_path, must_use_attr};
|
use crate::{match_def_path, must_use_attr};
|
||||||
|
|
||||||
|
@ -112,6 +113,7 @@ pub fn has_iter_method(cx: &LateContext<'_>, probably_ref_ty: Ty<'_>) -> Option<
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Checks whether a type implements a trait.
|
/// Checks whether a type implements a trait.
|
||||||
|
/// The function returns false in case the type contains an inference variable.
|
||||||
/// See also `get_trait_def_id`.
|
/// See also `get_trait_def_id`.
|
||||||
pub fn implements_trait<'tcx>(
|
pub fn implements_trait<'tcx>(
|
||||||
cx: &LateContext<'tcx>,
|
cx: &LateContext<'tcx>,
|
||||||
|
@ -119,18 +121,18 @@ pub fn implements_trait<'tcx>(
|
||||||
trait_id: DefId,
|
trait_id: DefId,
|
||||||
ty_params: &[GenericArg<'tcx>],
|
ty_params: &[GenericArg<'tcx>],
|
||||||
) -> bool {
|
) -> bool {
|
||||||
// Do not check on infer_types to avoid panic in evaluate_obligation.
|
// Clippy shouldn't have infer types
|
||||||
if ty.has_infer_types() {
|
assert!(!ty.needs_infer());
|
||||||
return false;
|
|
||||||
}
|
|
||||||
let ty = cx.tcx.erase_regions(ty);
|
let ty = cx.tcx.erase_regions(ty);
|
||||||
if ty.has_escaping_bound_vars() {
|
if ty.has_escaping_bound_vars() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
let ty_params = cx.tcx.mk_substs(ty_params.iter());
|
let ty_params = cx.tcx.mk_substs(ty_params.iter());
|
||||||
cx.tcx
|
cx.tcx.infer_ctxt().enter(|infcx|
|
||||||
.type_implements_trait((trait_id, ty, ty_params, cx.param_env))
|
infcx.type_implements_trait(trait_id, ty, ty_params, cx.param_env)
|
||||||
.must_apply_modulo_regions()
|
.must_apply_modulo_regions()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Checks whether this type implements `Drop`.
|
/// Checks whether this type implements `Drop`.
|
||||||
|
|
Loading…
Reference in a new issue