Check that opaque is a defining use, prefer pre-defined opaques
This commit is contained in:
parent
f3c9c21658
commit
e3f8beaed6
3 changed files with 127 additions and 14 deletions
|
@ -518,6 +518,42 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
/// Checks whether each generic argument is simply a unique generic placeholder.
|
||||
///
|
||||
/// This is used in the new solver, which canonicalizes params to placeholders
|
||||
/// for better caching.
|
||||
pub fn uses_unique_placeholders_ignoring_regions(
|
||||
self,
|
||||
substs: SubstsRef<'tcx>,
|
||||
) -> Result<(), NotUniqueParam<'tcx>> {
|
||||
let mut seen = GrowableBitSet::default();
|
||||
for arg in substs {
|
||||
match arg.unpack() {
|
||||
// Ignore regions, since we can't resolve those in a canonicalized
|
||||
// query in the trait solver.
|
||||
GenericArgKind::Lifetime(_) => {}
|
||||
GenericArgKind::Type(t) => match t.kind() {
|
||||
ty::Placeholder(p) => {
|
||||
if !seen.insert(p.bound.var) {
|
||||
return Err(NotUniqueParam::DuplicateParam(t.into()));
|
||||
}
|
||||
}
|
||||
_ => return Err(NotUniqueParam::NotParam(t.into())),
|
||||
},
|
||||
GenericArgKind::Const(c) => match c.kind() {
|
||||
ty::ConstKind::Placeholder(p) => {
|
||||
if !seen.insert(p.bound) {
|
||||
return Err(NotUniqueParam::DuplicateParam(c.into()));
|
||||
}
|
||||
}
|
||||
_ => return Err(NotUniqueParam::NotParam(c.into())),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Returns `true` if `def_id` refers to a closure (e.g., `|x| x * 2`). Note
|
||||
/// that closures have a `DefId`, but the closure *expression* also
|
||||
/// has a `HirId` that is located within the context where the
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue