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

This commit is contained in:
Oli Scherer 2022-02-02 15:03:44 +00:00
parent 7f608eb9ed
commit be153f0976
3 changed files with 10 additions and 21 deletions

View file

@ -82,7 +82,14 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
let process = |a: Ty<'tcx>, b: Ty<'tcx>| match *a.kind() { let process = |a: Ty<'tcx>, b: Ty<'tcx>| match *a.kind() {
ty::Opaque(def_id, substs) => { ty::Opaque(def_id, substs) => {
if let ty::Opaque(did2, _) = *b.kind() { 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 self.tcx
.sess .sess
.struct_span_err( .struct_span_err(

View file

@ -1,3 +1,4 @@
// run-pass
// ignore-compare-mode-chalk // ignore-compare-mode-chalk
#![feature(fn_traits, #![feature(fn_traits,
@ -589,7 +590,7 @@ fn test_format_month() {
fn format_months(it: impl Iterator<Item = impl DateIterator>) fn format_months(it: impl Iterator<Item = impl DateIterator>)
-> impl Iterator<Item=impl Iterator<Item=String>> -> impl Iterator<Item=impl Iterator<Item=String>>
{ {
it.map(format_month) //~ ERROR opaque type's hidden type cannot be another opaque type it.map(format_month)
} }
/// Takes an iterator of iterators of strings; the sub-iterators are consumed /// Takes an iterator of iterators of strings; the sub-iterators are consumed

View file

@ -1,19 +0,0 @@
error: opaque type's hidden type cannot be another opaque type from the same scope
--> $DIR/example-calendar.rs:592:5
|
LL | it.map(format_month)
| ^^^^^^^^^^^^^^^^^^^^ one of the two opaque types used here has to be outside its defining scope
|
note: opaque type whose hidden type is being assigned
--> $DIR/example-calendar.rs:560:43
|
LL | fn format_month(it: impl DateIterator) -> impl Iterator<Item=String> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
note: opaque type being used as hidden type
--> $DIR/example-calendar.rs:590:39
|
LL | -> impl Iterator<Item=impl Iterator<Item=String>>
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error