mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
Test generalization during coherence
This commit is contained in:
parent
11adf03790
commit
c16a90f5e3
@ -548,7 +548,7 @@ impl<'tcx> TypeRelation<'tcx> for Generalizer<'_, 'tcx> {
|
||||
}
|
||||
|
||||
fn mark_ambiguous(&mut self) {
|
||||
self.infcx.tcx.sess.delay_span_bug(self.cause.span, "we only generalize opaque types in situations where we already error for them elsewhere in coherence");
|
||||
span_bug!(self.cause.span, "opaque types are handled in `tys`");
|
||||
}
|
||||
|
||||
fn binders<T>(
|
||||
@ -675,6 +675,10 @@ impl<'tcx> TypeRelation<'tcx> for Generalizer<'_, 'tcx> {
|
||||
// relatable.
|
||||
Ok(t)
|
||||
}
|
||||
ty::Opaque(def_id, substs) => {
|
||||
let s = self.relate(substs, substs)?;
|
||||
Ok(if s == substs { t } else { self.infcx.tcx.mk_opaque(def_id, s) })
|
||||
}
|
||||
_ => relate::super_relate_tys(self, t, t),
|
||||
}?;
|
||||
|
||||
|
@ -0,0 +1,13 @@
|
||||
// check-pass
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
trait Trait {}
|
||||
type Opaque<T> = impl Sized;
|
||||
fn foo<T>() -> Opaque<T> {
|
||||
()
|
||||
}
|
||||
|
||||
impl<T, V> Trait for (T, V, V, u32) {}
|
||||
impl<U, V> Trait for (Opaque<U>, V, i32, V) {}
|
||||
|
||||
fn main() {}
|
Loading…
Reference in New Issue
Block a user