normalize receiver substs and erase the regions
use a smaller example
This commit is contained in:
parent
f34356eace
commit
3bc54baa61
2 changed files with 66 additions and 1 deletions
|
@ -44,7 +44,13 @@ fn inner_resolve_instance<'tcx>(
|
||||||
|
|
||||||
let result = if let Some(trait_def_id) = tcx.trait_of_item(def.did) {
|
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);
|
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 {
|
} else {
|
||||||
let ty = tcx.type_of(def.def_id_for_type_of());
|
let ty = tcx.type_of(def.def_id_for_type_of());
|
||||||
let item_type = tcx.subst_and_normalize_erasing_regions(substs, param_env, ty);
|
let item_type = tcx.subst_and_normalize_erasing_regions(substs, param_env, ty);
|
||||||
|
|
59
src/test/ui/associated-item/issue-105449.rs
Normal file
59
src/test/ui/associated-item/issue-105449.rs
Normal file
|
@ -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() {}
|
Loading…
Add table
Add a link
Reference in a new issue