Skip to content

Commit

Permalink
Rollup merge of #105561 - TaKO8Ki:fix-105449, r=fee1-dead
Browse files Browse the repository at this point in the history
Normalize receiver substs and erase the regions

Fixes #105449
  • Loading branch information
matthiaskrgr authored Dec 12, 2022
2 parents d539628 + 3bc54ba commit f4cca46
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 1 deletion.
8 changes: 7 additions & 1 deletion compiler/rustc_ty_utils/src/instance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
59 changes: 59 additions & 0 deletions src/test/ui/associated-item/issue-105449.rs
Original file line number Diff line number Diff line change
@@ -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() {}

0 comments on commit f4cca46

Please sign in to comment.