diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-12-12 19:20:34 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-12-12 19:20:34 +0100 |
| commit | f4cca4607877b7fde56755d7750455470fb4f4f8 (patch) | |
| tree | 52cea861ea3b8f7b7a33333429b1ad7ccba599fb | |
| parent | d53962896075507ba88e489bd401f80b4fb71d83 (diff) | |
| parent | 3bc54baa61b250865701ea56bb1e5fde69af92c0 (diff) | |
| download | rust-f4cca4607877b7fde56755d7750455470fb4f4f8.tar.gz rust-f4cca4607877b7fde56755d7750455470fb4f4f8.zip | |
Rollup merge of #105561 - TaKO8Ki:fix-105449, r=fee1-dead
Normalize receiver substs and erase the regions Fixes #105449
| -rw-r--r-- | compiler/rustc_ty_utils/src/instance.rs | 8 | ||||
| -rw-r--r-- | src/test/ui/associated-item/issue-105449.rs | 59 |
2 files changed, 66 insertions, 1 deletions
diff --git a/compiler/rustc_ty_utils/src/instance.rs b/compiler/rustc_ty_utils/src/instance.rs index c6f2b16ca21..2da98d33429 100644 --- a/compiler/rustc_ty_utils/src/instance.rs +++ b/compiler/rustc_ty_utils/src/instance.rs @@ -44,7 +44,13 @@ fn inner_resolve_instance<'tcx>( let result = if let Some(trait_def_id) = tcx.trait_of_item(def.did) { debug!(" => associated item, attempting to find impl in param_env {:#?}", param_env); - resolve_associated_item(tcx, def.did, param_env, trait_def_id, substs) + resolve_associated_item( + tcx, + def.did, + param_env, + trait_def_id, + tcx.normalize_erasing_regions(param_env, substs), + ) } else { let ty = tcx.type_of(def.def_id_for_type_of()); let item_type = tcx.subst_and_normalize_erasing_regions(substs, param_env, ty); diff --git a/src/test/ui/associated-item/issue-105449.rs b/src/test/ui/associated-item/issue-105449.rs new file mode 100644 index 00000000000..dd14e05fd49 --- /dev/null +++ b/src/test/ui/associated-item/issue-105449.rs @@ -0,0 +1,59 @@ +// check-pass +// compile-flags: -C debug_assertions=yes -Zunstable-options + +#[allow(dead_code)] +fn problematic_function<Space>() +where + DefaultAlloc: FinAllok<R1, Space>, +{ + let e = Edge2dElement; + let _ = Into::<Point>::into(e.map_reference_coords()); +} +impl<N> Allocator<N, R0> for DefaultAlloc { + type Buffer = MStorage; +} +impl<N> Allocator<N, R1> for DefaultAlloc { + type Buffer = MStorage; +} +impl<N, D> From<VectorN<N, D>> for Point +where + DefaultAlloc: Allocator<N, D>, +{ + fn from(_: VectorN<N, D>) -> Self { + unimplemented!() + } +} +impl<GeometryDim, NodalDim> FinAllok<GeometryDim, NodalDim> for DefaultAlloc +where + DefaultAlloc: Allocator<Ure, GeometryDim>, + DefaultAlloc: Allocator<Ure, NodalDim> +{ +} +impl FiniteElement<R1> for Edge2dElement { + fn map_reference_coords(&self) -> VectorN<Ure, R1> { + unimplemented!() + } +} +type VectorN<N, R> = (N, R, <DefaultAlloc as Allocator<N, R>>::Buffer); +struct DefaultAlloc; +struct R0; +struct R1; +struct MStorage; +struct Point; +struct Edge2dElement; +struct Ure; +trait Allocator<N, R> { + type Buffer; +} +trait FinAllok<GeometryDim, NodalDim>: + Allocator<Ure, GeometryDim> + + Allocator<Ure, NodalDim> + +{ +} +trait FiniteElement<Rau> +where + DefaultAlloc: FinAllok<Rau, Rau>, +{ + fn map_reference_coords(&self) -> VectorN<Ure, Rau>; +} +fn main() {} |
