diff options
| author | Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de> | 2022-02-02 15:03:44 +0000 |
|---|---|---|
| committer | Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de> | 2022-02-02 15:40:12 +0000 |
| commit | be153f0976705f8d7ca45540a4965bb156b2cc34 (patch) | |
| tree | d6575d4f5d10c48daff632ee98c02c6b7f0dfad8 | |
| parent | 7f608eb9edb38ff271ff5be50dbbbb424cbf348f (diff) | |
| download | rust-be153f0976705f8d7ca45540a4965bb156b2cc34.tar.gz rust-be153f0976705f8d7ca45540a4965bb156b2cc34.zip | |
Only prevent TAITs from defining each other, RPIT and async are fine, they only ever have one defining site, and it is ordered correctly around expected and actual type in type comparisons
| -rw-r--r-- | compiler/rustc_infer/src/infer/opaque_types.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/impl-trait/example-calendar.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/impl-trait/example-calendar.stderr | 19 |
3 files changed, 10 insertions, 21 deletions
diff --git a/compiler/rustc_infer/src/infer/opaque_types.rs b/compiler/rustc_infer/src/infer/opaque_types.rs index 35104c71bfc..46420fbe0c3 100644 --- a/compiler/rustc_infer/src/infer/opaque_types.rs +++ b/compiler/rustc_infer/src/infer/opaque_types.rs @@ -82,7 +82,14 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { let process = |a: Ty<'tcx>, b: Ty<'tcx>| match *a.kind() { ty::Opaque(def_id, substs) => { if let ty::Opaque(did2, _) = *b.kind() { - if self.opaque_type_origin(did2, cause.span).is_some() { + // We could accept this, but there are various ways to handle this situation, and we don't + // want to make a decision on it right now. Likely this case is so super rare anyway, that + // no one encounters it in practice. + // It does occur however in `fn fut() -> impl Future<Output = i32> { async { 42 } }`, + // where it is of no concern, so we only check for TAITs. + if let Some(OpaqueTyOrigin::TyAlias) = + self.opaque_type_origin(did2, cause.span) + { self.tcx .sess .struct_span_err( diff --git a/src/test/ui/impl-trait/example-calendar.rs b/src/test/ui/impl-trait/example-calendar.rs index 26618eec1d7..45dcb74a6e0 100644 --- a/src/test/ui/impl-trait/example-calendar.rs +++ b/src/test/ui/impl-trait/example-calendar.rs @@ -1,3 +1,4 @@ +// run-pass // ignore-compare-mode-chalk #