Closed s-panferov closed 9 years ago
Smaller test case that hits a different assert in the same general code path:
ice.rs:
pub trait Tr {
fn tr(&self);
}
pub struct St<V>(pub Vec<V>);
impl<V> Tr for St<V> {
fn tr(&self) {
match self {
&St(ref v) => {
v.iter();
}
}
}
}
test.rs:
extern crate ice;
use ice::{St,Tr};
fn main() {
let st: St<()> = St(vec![]);
st.tr();
}
This one is pretty nasty. As far as I can tell, this is what's going on:
is_discr_reassigned
expr_use_visitor
v.iter()
, mem_categorization
tries to apply adjustments due to the autoderefsadjust_ty
in ty
, which drills down through the autoderefsVec<()>
to get its return type. This calls through a closure that was provided by mem_categorization
.BlockS
in transTyper
impl for BlockS
does a straight lookup in the type context, but does not monomorphize the resultimpl<T> Deref<[T]> for Vec<T>
)&[<generic>]
instead of &[()]
as we shouldIt seems like we want Typer::node_method_ty
for BlockS
to monomorphize the returned type in the same way node_ty
does. I'll try this and see if tests look good.
ICE:
How to reproduce:
Main body:
Test body: