Rollup merge of #131482 - compiler-errors:struct-res, r=lcnr

structurally resolve adts and tuples expectations too

r? lcnr
This commit is contained in:
Matthias Krüger 2024-10-10 12:49:21 +02:00 committed by GitHub
commit 02930953d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 2 deletions

View File

@ -1783,7 +1783,7 @@ fn check_expr_tuple(
expr: &'tcx hir::Expr<'tcx>,
) -> Ty<'tcx> {
let flds = expected.only_has_type(self).and_then(|ty| {
let ty = self.resolve_vars_with_obligations(ty);
let ty = self.try_structurally_resolve_type(expr.span, ty);
match ty.kind() {
ty::Tuple(flds) => Some(&flds[..]),
_ => None,
@ -1861,7 +1861,7 @@ fn check_expr_struct_fields(
) {
let tcx = self.tcx;
let adt_ty = self.resolve_vars_with_obligations(adt_ty);
let adt_ty = self.try_structurally_resolve_type(span, adt_ty);
let adt_ty_hint = expected.only_has_type(self).and_then(|expected| {
self.fudge_inference_if_ok(|| {
let ocx = ObligationCtxt::new(self);

View File

@ -0,0 +1,32 @@
//@ compile-flags: -Znext-solver
//@ check-pass
// Makes sure we structurally normalize before trying to use expectation to guide
// coercion in adt and tuples.
use std::any::Any;
trait Coerce {
type Assoc;
}
struct TupleGuidance;
impl Coerce for TupleGuidance {
type Assoc = (&'static dyn Any,);
}
struct AdtGuidance;
impl Coerce for AdtGuidance {
type Assoc = Adt<&'static dyn Any>;
}
struct Adt<T> {
f: T,
}
fn foo<'a, T: Coerce>(_: T::Assoc) {}
fn main() {
foo::<TupleGuidance>((&0u32,));
foo::<AdtGuidance>(Adt { f: &0u32 });
}