Skip to content

Commit 6dc78b0

Browse files
committed
Use variances for defining use diag.
1 parent 082217a commit 6dc78b0

File tree

1 file changed

+5
-53
lines changed
  • compiler/rustc_middle/src/ty

1 file changed

+5
-53
lines changed

compiler/rustc_middle/src/ty/mod.rs

Lines changed: 5 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,61 +1345,13 @@ impl<'tcx> OpaqueHiddenType<'tcx> {
13451345
// type Foo<'a, 'b, 'c> = impl Trait<'a> + 'b;
13461346
// ```
13471347
// we may not use `'c` in the hidden type.
1348-
struct OpaqueTypeLifetimeCollector<'tcx> {
1349-
lifetimes: FxHashSet<ty::Region<'tcx>>,
1350-
}
1351-
1352-
impl<'tcx> ty::TypeVisitor<'tcx> for OpaqueTypeLifetimeCollector<'tcx> {
1353-
fn visit_region(&mut self, r: ty::Region<'tcx>) -> ControlFlow<Self::BreakTy> {
1354-
self.lifetimes.insert(r);
1355-
r.super_visit_with(self)
1356-
}
1357-
}
1348+
let variances = tcx.variances_of(def_id);
1349+
debug!(?variances);
13581350

1359-
let mut collector = OpaqueTypeLifetimeCollector { lifetimes: Default::default() };
1360-
1361-
for pred in tcx.bound_explicit_item_bounds(def_id.to_def_id()).transpose_iter() {
1362-
let pred = pred.map_bound(|(pred, _)| *pred).subst(tcx, id_substs);
1363-
1364-
trace!(pred=?pred.kind());
1365-
1366-
// We only ignore opaque type substs if the opaque type is the outermost type.
1367-
// The opaque type may be nested within itself via recursion in e.g.
1368-
// type Foo<'a> = impl PartialEq<Foo<'a>>;
1369-
// which thus mentions `'a` and should thus accept hidden types that borrow 'a
1370-
// instead of requiring an additional `+ 'a`.
1371-
match pred.kind().skip_binder() {
1372-
ty::PredicateKind::Trait(TraitPredicate {
1373-
trait_ref: ty::TraitRef { def_id: _, substs },
1374-
constness: _,
1375-
polarity: _,
1376-
}) => {
1377-
trace!(?substs);
1378-
for subst in &substs[1..] {
1379-
subst.visit_with(&mut collector);
1380-
}
1381-
}
1382-
ty::PredicateKind::Projection(ty::ProjectionPredicate {
1383-
projection_ty: ty::ProjectionTy { substs, item_def_id: _ },
1384-
term,
1385-
}) => {
1386-
for subst in &substs[1..] {
1387-
subst.visit_with(&mut collector);
1388-
}
1389-
term.visit_with(&mut collector);
1390-
}
1391-
_ => {
1392-
pred.visit_with(&mut collector);
1393-
}
1394-
}
1395-
}
1396-
let lifetimes = collector.lifetimes;
1397-
trace!(?lifetimes);
13981351
map.filter(|(_, v)| {
1399-
let ty::GenericArgKind::Lifetime(lt) = v.unpack() else {
1400-
return true;
1401-
};
1402-
lifetimes.contains(&lt)
1352+
let ty::GenericArgKind::Lifetime(lt) = v.unpack() else { return true };
1353+
let ty::ReEarlyBound(ebr) = lt.kind() else { bug!() };
1354+
variances[ebr.index as usize] == ty::Variance::Invariant
14031355
})
14041356
.collect()
14051357
}

0 commit comments

Comments
 (0)