]> git.lizzy.rs Git - rust.git/commitdiff
Simplify insert_outlives_predicate opaque type logic
authorOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>
Tue, 21 Jun 2022 15:42:25 +0000 (15:42 +0000)
committerOli Scherer <git-spam-no-reply9815368754983@oli-obk.de>
Wed, 21 Sep 2022 13:15:24 +0000 (13:15 +0000)
compiler/rustc_typeck/src/outlives/utils.rs
src/test/ui/type-alias-impl-trait/unbounded_opaque_type.rs [new file with mode: 0644]

index 4c32a1e81ba542b2bc1a2483187474e5a5439643..f582fdf903ddd6e84cc0ce4c1e5b108bba39e31b 100644 (file)
@@ -1,6 +1,6 @@
 use rustc_infer::infer::outlives::components::{push_outlives_components, Component};
 use rustc_middle::ty::subst::{GenericArg, GenericArgKind};
-use rustc_middle::ty::{self, EarlyBinder, Region, Ty, TyCtxt};
+use rustc_middle::ty::{self, Region, Ty, TyCtxt};
 use rustc_span::Span;
 use smallvec::smallvec;
 use std::collections::BTreeMap;
@@ -97,36 +97,20 @@ pub(crate) fn insert_outlives_predicate<'tcx>(
                     }
 
                     Component::Opaque(def_id, substs) => {
-                        for predicate in tcx.item_bounds(def_id) {
-                            let predicate = EarlyBinder(predicate).subst(tcx, substs);
-                            // FIXME(oli-obk): fishy skip-binder
-                            match predicate.kind().skip_binder() {
-                                ty::PredicateKind::Trait(tp) => {
-                                    for subst in tp.trait_ref.substs {
-                                        insert_outlives_predicate(
-                                            tcx,
-                                            subst,
-                                            outlived_region,
-                                            span,
-                                            required_predicates,
-                                        )
-                                    }
-                                }
-                                ty::PredicateKind::RegionOutlives(_)
-                                | ty::PredicateKind::TypeOutlives(_)
-                                | ty::PredicateKind::Projection(_)
-                                | ty::PredicateKind::WellFormed(_)
-                                | ty::PredicateKind::ObjectSafe(_)
-                                | ty::PredicateKind::ClosureKind(_, _, _)
-                                | ty::PredicateKind::Subtype(_)
-                                | ty::PredicateKind::Coerce(_)
-                                | ty::PredicateKind::ConstEvaluatable(_)
-                                | ty::PredicateKind::ConstEquate(_, _)
-                                | ty::PredicateKind::TypeWellFormedFromEnv(_) => {
-                                    todo!("{:#?}", predicate)
-                                }
-                            }
-                        }
+                        // This would arise from something like:
+                        //
+                        // ```rust
+                        // type Opaque<T> = impl Sized;
+                        // fn defining<T>() -> Opaque<T> {}
+                        // struct Ss<'a, T>(&'a Opaque<T>);
+                        // ```
+                        //
+                        // Here we want to require an explicit `where Opaque<T>: 'a`
+
+                        let ty = tcx.mk_opaque(def_id, substs);
+                        required_predicates
+                            .entry(ty::OutlivesPredicate(ty.into(), outlived_region))
+                            .or_insert(span);
                     }
 
                     Component::EscapingProjection(_) => {
diff --git a/src/test/ui/type-alias-impl-trait/unbounded_opaque_type.rs b/src/test/ui/type-alias-impl-trait/unbounded_opaque_type.rs
new file mode 100644 (file)
index 0000000..a5ab3e1
--- /dev/null
@@ -0,0 +1,8 @@
+// check-pass
+
+#![feature(type_alias_impl_trait)]
+type Opaque<T> = impl Sized;
+fn defining<T>() -> Opaque<T> {}
+struct Ss<'a, T>(&'a Opaque<T>);
+
+fn main() {}