Auto merge of #92719 - matthiaskrgr:rollup-tc7oqys, r=matthiaskrgr · rust-lang/rust@89b9f7b (original) (raw)

`@@ -1400,8 +1400,17 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(

`

1400

1400

`// Any type with multiple potential metadata types is therefore not eligible.

`

1401

1401

`let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty());

`

1402

1402

``

1403

``

`-

// FIXME: should this normalize?

`

1404

``

`-

let tail = selcx.tcx().struct_tail_without_normalization(self_ty);

`

``

1403

`+

let tail = selcx.tcx().struct_tail_with_normalize(self_ty, |ty| {

`

``

1404

`+

normalize_with_depth(

`

``

1405

`+

selcx,

`

``

1406

`+

obligation.param_env,

`

``

1407

`+

obligation.cause.clone(),

`

``

1408

`+

obligation.recursion_depth + 1,

`

``

1409

`+

ty,

`

``

1410

`+

)

`

``

1411

`+

.value

`

``

1412

`+

});

`

``

1413

+

1405

1414

`match tail.kind() {

`

1406

1415

` ty::Bool

`

1407

1416

` | ty::Char

`

`@@ -1435,7 +1444,12 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(

`

1435

1444

` | ty::Bound(..)

`

1436

1445

` | ty::Placeholder(..)

`

1437

1446

` | ty::Infer(..)

`

1438

``

`-

| ty::Error(_) => false,

`

``

1447

`+

| ty::Error(_) => {

`

``

1448

`+

if tail.has_infer_types() {

`

``

1449

`+

candidate_set.mark_ambiguous();

`

``

1450

`+

}

`

``

1451

`+

false

`

``

1452

`+

},

`

1439

1453

`}

`

1440

1454

`}

`

1441

1455

`super::ImplSource::Param(..) => {

`

`@@ -1640,18 +1654,30 @@ fn confirm_pointee_candidate<'cx, 'tcx>(

`

1640

1654

` _: ImplSourcePointeeData,

`

1641

1655

`) -> Progress<'tcx> {

`

1642

1656

`let tcx = selcx.tcx();

`

1643

``

-

1644

1657

`let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty());

`

1645

``

`-

let substs = tcx.mk_substs([self_ty.into()].iter());

`

1646

1658

``

``

1659

`+

let mut obligations = vec![];

`

``

1660

`+

let metadata_ty = self_ty.ptr_metadata_ty(tcx, |ty| {

`

``

1661

`+

normalize_with_depth_to(

`

``

1662

`+

selcx,

`

``

1663

`+

obligation.param_env,

`

``

1664

`+

obligation.cause.clone(),

`

``

1665

`+

obligation.recursion_depth + 1,

`

``

1666

`+

ty,

`

``

1667

`+

&mut obligations,

`

``

1668

`+

)

`

``

1669

`+

});

`

``

1670

+

``

1671

`+

let substs = tcx.mk_substs([self_ty.into()].iter());

`

1647

1672

`let metadata_def_id = tcx.require_lang_item(LangItem::Metadata, None);

`

1648

1673

``

1649

1674

`let predicate = ty::ProjectionPredicate {

`

1650

1675

`projection_ty: ty::ProjectionTy { substs, item_def_id: metadata_def_id },

`

1651

``

`-

ty: self_ty.ptr_metadata_ty(tcx),

`

``

1676

`+

ty: metadata_ty,

`

1652

1677

`};

`

1653

1678

``

1654

1679

`confirm_param_env_candidate(selcx, obligation, ty::Binder::dummy(predicate), false)

`

``

1680

`+

.with_addl_obligations(obligations)

`

1655

1681

`}

`

1656

1682

``

1657

1683

`fn confirm_fn_pointer_candidate<'cx, 'tcx>(

`