10819: internal: Replace some `Vec` occurences with `Box`  r=Veykril a=Veykril

Shaves off ~15mb from self analysis

Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
bors[bot] 2021-11-20 15:40:56 +00:00 committed by GitHub
commit f2707bce36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 78 additions and 100 deletions

View File

@ -130,11 +130,7 @@ impl ExprCollector<'_> {
self.body.params.push(param_pat); self.body.params.push(param_pat);
} }
for param in param_list.params() { for pat in param_list.params().filter_map(|param| param.pat()) {
let pat = match param.pat() {
None => continue,
Some(pat) => pat,
};
let param_pat = self.collect_pat(pat); let param_pat = self.collect_pat(pat);
self.body.params.push(param_pat); self.body.params.push(param_pat);
} }
@ -160,7 +156,7 @@ impl ExprCollector<'_> {
self.make_expr(expr, Err(SyntheticSyntax)) self.make_expr(expr, Err(SyntheticSyntax))
} }
fn unit(&mut self) -> ExprId { fn unit(&mut self) -> ExprId {
self.alloc_expr_desugared(Expr::Tuple { exprs: Vec::new() }) self.alloc_expr_desugared(Expr::Tuple { exprs: Box::default() })
} }
fn missing_expr(&mut self) -> ExprId { fn missing_expr(&mut self) -> ExprId {
self.alloc_expr_desugared(Expr::Missing) self.alloc_expr_desugared(Expr::Missing)
@ -235,7 +231,8 @@ impl ExprCollector<'_> {
expr: else_branch.unwrap_or_else(|| self.unit()), expr: else_branch.unwrap_or_else(|| self.unit()),
guard: None, guard: None,
}, },
]; ]
.into();
return Some( return Some(
self.alloc_expr(Expr::Match { expr: match_expr, arms }, syntax_ptr), self.alloc_expr(Expr::Match { expr: match_expr, arms }, syntax_ptr),
); );
@ -300,7 +297,8 @@ impl ExprCollector<'_> {
let arms = vec![ let arms = vec![
MatchArm { pat, expr: body, guard: None }, MatchArm { pat, expr: body, guard: None },
MatchArm { pat: placeholder_pat, expr: break_, guard: None }, MatchArm { pat: placeholder_pat, expr: break_, guard: None },
]; ]
.into();
let match_expr = let match_expr =
self.alloc_expr_desugared(Expr::Match { expr: match_expr, arms }); self.alloc_expr_desugared(Expr::Match { expr: match_expr, arms });
return Some( return Some(
@ -324,7 +322,7 @@ impl ExprCollector<'_> {
let args = if let Some(arg_list) = e.arg_list() { let args = if let Some(arg_list) = e.arg_list() {
arg_list.args().filter_map(|e| self.maybe_collect_expr(e)).collect() arg_list.args().filter_map(|e| self.maybe_collect_expr(e)).collect()
} else { } else {
Vec::new() Box::default()
}; };
self.alloc_expr(Expr::Call { callee, args }, syntax_ptr) self.alloc_expr(Expr::Call { callee, args }, syntax_ptr)
} }
@ -333,7 +331,7 @@ impl ExprCollector<'_> {
let args = if let Some(arg_list) = e.arg_list() { let args = if let Some(arg_list) = e.arg_list() {
arg_list.args().filter_map(|e| self.maybe_collect_expr(e)).collect() arg_list.args().filter_map(|e| self.maybe_collect_expr(e)).collect()
} else { } else {
Vec::new() Box::default()
}; };
let method_name = e.name_ref().map(|nr| nr.as_name()).unwrap_or_else(Name::missing); let method_name = e.name_ref().map(|nr| nr.as_name()).unwrap_or_else(Name::missing);
let generic_args = e let generic_args = e
@ -367,7 +365,7 @@ impl ExprCollector<'_> {
}) })
.collect() .collect()
} else { } else {
Vec::new() Box::default()
}; };
self.alloc_expr(Expr::Match { expr, arms }, syntax_ptr) self.alloc_expr(Expr::Match { expr, arms }, syntax_ptr)
} }
@ -429,7 +427,7 @@ impl ExprCollector<'_> {
let spread = nfl.spread().map(|s| self.collect_expr(s)); let spread = nfl.spread().map(|s| self.collect_expr(s));
Expr::RecordLit { path, fields, spread } Expr::RecordLit { path, fields, spread }
} else { } else {
Expr::RecordLit { path, fields: Vec::new(), spread: None } Expr::RecordLit { path, fields: Box::default(), spread: None }
}; };
self.alloc_expr(record_lit, syntax_ptr) self.alloc_expr(record_lit, syntax_ptr)
@ -496,7 +494,10 @@ impl ExprCollector<'_> {
.and_then(|r| r.ty()) .and_then(|r| r.ty())
.map(|it| Interned::new(TypeRef::from_ast(&self.ctx(), it))); .map(|it| Interned::new(TypeRef::from_ast(&self.ctx(), it)));
let body = self.collect_expr_opt(e.body()); let body = self.collect_expr_opt(e.body());
self.alloc_expr(Expr::Lambda { args, arg_types, ret_type, body }, syntax_ptr) self.alloc_expr(
Expr::Lambda { args: args.into(), arg_types: arg_types.into(), ret_type, body },
syntax_ptr,
)
} }
ast::Expr::BinExpr(e) => { ast::Expr::BinExpr(e) => {
let lhs = self.collect_expr_opt(e.lhs()); let lhs = self.collect_expr_opt(e.lhs());
@ -718,7 +719,7 @@ impl ExprCollector<'_> {
self.statements_in_scope.pop(); self.statements_in_scope.pop();
} }
let tail = tail; let tail = tail;
let statements = std::mem::replace(&mut self.statements_in_scope, prev_statements); let statements = std::mem::replace(&mut self.statements_in_scope, prev_statements).into();
let syntax_node_ptr = AstPtr::new(&block.into()); let syntax_node_ptr = AstPtr::new(&block.into());
let expr_id = self.alloc_expr( let expr_id = self.alloc_expr(
Expr::Block { id: block_id, statements, tail, label: None }, Expr::Block { id: block_id, statements, tail, label: None },
@ -812,7 +813,7 @@ impl ExprCollector<'_> {
ast::Pat::RecordPat(p) => { ast::Pat::RecordPat(p) => {
let path = let path =
p.path().and_then(|path| self.expander.parse_path(self.db, path)).map(Box::new); p.path().and_then(|path| self.expander.parse_path(self.db, path)).map(Box::new);
let args: Vec<_> = p let args = p
.record_pat_field_list() .record_pat_field_list()
.expect("every struct should have a field list") .expect("every struct should have a field list")
.fields() .fields()
@ -902,7 +903,7 @@ impl ExprCollector<'_> {
} }
} }
fn collect_tuple_pat(&mut self, args: AstChildren<ast::Pat>) -> (Vec<PatId>, Option<usize>) { fn collect_tuple_pat(&mut self, args: AstChildren<ast::Pat>) -> (Box<[PatId]>, Option<usize>) {
// Find the location of the `..`, if there is one. Note that we do not // Find the location of the `..`, if there is one. Note that we do not
// consider the possibility of there being multiple `..` here. // consider the possibility of there being multiple `..` here.
let ellipsis = args.clone().position(|p| matches!(p, ast::Pat::RestPat(_))); let ellipsis = args.clone().position(|p| matches!(p, ast::Pat::RestPat(_)));
@ -961,7 +962,7 @@ impl From<ast::LiteralKind> for Literal {
Literal::Float(Default::default(), ty) Literal::Float(Default::default(), ty)
} }
LiteralKind::ByteString(bs) => { LiteralKind::ByteString(bs) => {
let text = bs.value().map(Vec::from).unwrap_or_else(Default::default); let text = bs.value().map(Box::from).unwrap_or_else(Default::default);
Literal::ByteString(text) Literal::ByteString(text)
} }
LiteralKind::String(_) => Literal::String(Default::default()), LiteralKind::String(_) => Literal::String(Default::default()),

View File

@ -204,7 +204,7 @@ fn compute_expr_scopes(expr: ExprId, body: &Body, scopes: &mut ExprScopes, scope
} }
Expr::Match { expr, arms } => { Expr::Match { expr, arms } => {
compute_expr_scopes(*expr, body, scopes, scope); compute_expr_scopes(*expr, body, scopes, scope);
for arm in arms { for arm in arms.iter() {
let mut scope = scopes.new_scope(scope); let mut scope = scopes.new_scope(scope);
scopes.add_bindings(body, scope, arm.pat); scopes.add_bindings(body, scope, arm.pat);
match arm.guard { match arm.guard {

View File

@ -40,8 +40,8 @@ pub type LabelId = Idx<Label>;
#[derive(Debug, Clone, Eq, PartialEq)] #[derive(Debug, Clone, Eq, PartialEq)]
pub enum Literal { pub enum Literal {
String(String), String(Box<str>),
ByteString(Vec<u8>), ByteString(Box<[u8]>),
Char(char), Char(char),
Bool(bool), Bool(bool),
Int(i128, Option<BuiltinInt>), Int(i128, Option<BuiltinInt>),
@ -61,7 +61,7 @@ pub enum Expr {
}, },
Block { Block {
id: BlockId, id: BlockId,
statements: Vec<Statement>, statements: Box<[Statement]>,
tail: Option<ExprId>, tail: Option<ExprId>,
label: Option<LabelId>, label: Option<LabelId>,
}, },
@ -82,17 +82,17 @@ pub enum Expr {
}, },
Call { Call {
callee: ExprId, callee: ExprId,
args: Vec<ExprId>, args: Box<[ExprId]>,
}, },
MethodCall { MethodCall {
receiver: ExprId, receiver: ExprId,
method_name: Name, method_name: Name,
args: Vec<ExprId>, args: Box<[ExprId]>,
generic_args: Option<Box<GenericArgs>>, generic_args: Option<Box<GenericArgs>>,
}, },
Match { Match {
expr: ExprId, expr: ExprId,
arms: Vec<MatchArm>, arms: Box<[MatchArm]>,
}, },
Continue { Continue {
label: Option<Name>, label: Option<Name>,
@ -109,7 +109,7 @@ pub enum Expr {
}, },
RecordLit { RecordLit {
path: Option<Box<Path>>, path: Option<Box<Path>>,
fields: Vec<RecordLitField>, fields: Box<[RecordLitField]>,
spread: Option<ExprId>, spread: Option<ExprId>,
}, },
Field { Field {
@ -162,13 +162,13 @@ pub enum Expr {
index: ExprId, index: ExprId,
}, },
Lambda { Lambda {
args: Vec<PatId>, args: Box<[PatId]>,
arg_types: Vec<Option<Interned<TypeRef>>>, arg_types: Box<[Option<Interned<TypeRef>>]>,
ret_type: Option<Interned<TypeRef>>, ret_type: Option<Interned<TypeRef>>,
body: ExprId, body: ExprId,
}, },
Tuple { Tuple {
exprs: Vec<ExprId>, exprs: Box<[ExprId]>,
}, },
Unsafe { Unsafe {
body: ExprId, body: ExprId,
@ -182,7 +182,7 @@ pub enum Expr {
#[derive(Debug, Clone, Eq, PartialEq)] #[derive(Debug, Clone, Eq, PartialEq)]
pub enum Array { pub enum Array {
ElementList(Vec<ExprId>), ElementList(Box<[ExprId]>),
Repeat { initializer: ExprId, repeat: ExprId }, Repeat { initializer: ExprId, repeat: ExprId },
} }
@ -228,23 +228,23 @@ impl Expr {
Expr::If { condition, then_branch, else_branch } => { Expr::If { condition, then_branch, else_branch } => {
f(*condition); f(*condition);
f(*then_branch); f(*then_branch);
if let Some(else_branch) = else_branch { if let &Some(else_branch) = else_branch {
f(*else_branch); f(else_branch);
} }
} }
Expr::Block { statements, tail, .. } => { Expr::Block { statements, tail, .. } => {
for stmt in statements { for stmt in statements.iter() {
match stmt { match stmt {
Statement::Let { initializer, .. } => { Statement::Let { initializer, .. } => {
if let Some(expr) = initializer { if let &Some(expr) = initializer {
f(*expr); f(expr);
} }
} }
Statement::Expr { expr: expression, .. } => f(*expression), Statement::Expr { expr: expression, .. } => f(*expression),
} }
} }
if let Some(expr) = tail { if let &Some(expr) = tail {
f(*expr); f(expr);
} }
} }
Expr::TryBlock { body } Expr::TryBlock { body }
@ -262,34 +262,28 @@ impl Expr {
} }
Expr::Call { callee, args } => { Expr::Call { callee, args } => {
f(*callee); f(*callee);
for arg in args { args.iter().copied().for_each(f);
f(*arg);
}
} }
Expr::MethodCall { receiver, args, .. } => { Expr::MethodCall { receiver, args, .. } => {
f(*receiver); f(*receiver);
for arg in args { args.iter().copied().for_each(f);
f(*arg);
}
} }
Expr::Match { expr, arms } => { Expr::Match { expr, arms } => {
f(*expr); f(*expr);
for arm in arms { arms.iter().map(|arm| arm.expr).for_each(f);
f(arm.expr);
}
} }
Expr::Continue { .. } => {} Expr::Continue { .. } => {}
Expr::Break { expr, .. } | Expr::Return { expr } | Expr::Yield { expr } => { Expr::Break { expr, .. } | Expr::Return { expr } | Expr::Yield { expr } => {
if let Some(expr) = expr { if let &Some(expr) = expr {
f(*expr); f(expr);
} }
} }
Expr::RecordLit { fields, spread, .. } => { Expr::RecordLit { fields, spread, .. } => {
for field in fields { for field in fields.iter() {
f(field.expr); f(field.expr);
} }
if let Some(expr) = spread { if let &Some(expr) = spread {
f(*expr); f(expr);
} }
} }
Expr::Lambda { body, .. } => { Expr::Lambda { body, .. } => {
@ -300,11 +294,11 @@ impl Expr {
f(*rhs); f(*rhs);
} }
Expr::Range { lhs, rhs, .. } => { Expr::Range { lhs, rhs, .. } => {
if let Some(lhs) = rhs { if let &Some(lhs) = rhs {
f(*lhs); f(lhs);
} }
if let Some(rhs) = lhs { if let &Some(rhs) = lhs {
f(*rhs); f(rhs);
} }
} }
Expr::Index { base, index } => { Expr::Index { base, index } => {
@ -320,17 +314,9 @@ impl Expr {
| Expr::Box { expr } => { | Expr::Box { expr } => {
f(*expr); f(*expr);
} }
Expr::Tuple { exprs } => { Expr::Tuple { exprs } => exprs.iter().copied().for_each(f),
for expr in exprs {
f(*expr);
}
}
Expr::Array(a) => match a { Expr::Array(a) => match a {
Array::ElementList(exprs) => { Array::ElementList(exprs) => exprs.iter().copied().for_each(f),
for expr in exprs {
f(*expr);
}
}
Array::Repeat { initializer, repeat } => { Array::Repeat { initializer, repeat } => {
f(*initializer); f(*initializer);
f(*repeat) f(*repeat)
@ -386,15 +372,15 @@ pub struct RecordFieldPat {
pub enum Pat { pub enum Pat {
Missing, Missing,
Wild, Wild,
Tuple { args: Vec<PatId>, ellipsis: Option<usize> }, Tuple { args: Box<[PatId]>, ellipsis: Option<usize> },
Or(Vec<PatId>), Or(Box<[PatId]>),
Record { path: Option<Box<Path>>, args: Vec<RecordFieldPat>, ellipsis: bool }, Record { path: Option<Box<Path>>, args: Box<[RecordFieldPat]>, ellipsis: bool },
Range { start: ExprId, end: ExprId }, Range { start: ExprId, end: ExprId },
Slice { prefix: Vec<PatId>, slice: Option<PatId>, suffix: Vec<PatId> }, Slice { prefix: Box<[PatId]>, slice: Option<PatId>, suffix: Box<[PatId]> },
Path(Box<Path>), Path(Box<Path>),
Lit(ExprId), Lit(ExprId),
Bind { mode: BindingAnnotation, name: Name, subpat: Option<PatId> }, Bind { mode: BindingAnnotation, name: Name, subpat: Option<PatId> },
TupleStruct { path: Option<Box<Path>>, args: Vec<PatId>, ellipsis: Option<usize> }, TupleStruct { path: Option<Box<Path>>, args: Box<[PatId]>, ellipsis: Option<usize> },
Ref { pat: PatId, mutability: Mutability }, Ref { pat: PatId, mutability: Mutability },
Box { inner: PatId }, Box { inner: PatId },
ConstBlock(ExprId), ConstBlock(ExprId),

View File

@ -22,7 +22,7 @@ pub struct ModPath {
segments: Vec<Name>, segments: Vec<Name>,
} }
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum PathKind { pub enum PathKind {
Plain, Plain,
/// `self::` is `Super(0)` /// `self::` is `Super(0)`
@ -119,7 +119,7 @@ pub struct Path {
type_anchor: Option<Interned<TypeRef>>, type_anchor: Option<Interned<TypeRef>>,
mod_path: Interned<ModPath>, mod_path: Interned<ModPath>,
/// Invariant: the same len as `self.mod_path.segments` /// Invariant: the same len as `self.mod_path.segments`
generic_args: Vec<Option<Interned<GenericArgs>>>, generic_args: Box<[Option<Interned<GenericArgs>>]>,
} }
/// Generic arguments to a path segment (e.g. the `i32` in `Option<i32>`). This /// Generic arguments to a path segment (e.g. the `i32` in `Option<i32>`). This
@ -171,9 +171,9 @@ impl Path {
/// Converts a known mod path to `Path`. /// Converts a known mod path to `Path`.
pub fn from_known_path( pub fn from_known_path(
path: ModPath, path: ModPath,
generic_args: Vec<Option<Interned<GenericArgs>>>, generic_args: impl Into<Box<[Option<Interned<GenericArgs>>]>>,
) -> Path { ) -> Path {
Path { type_anchor: None, mod_path: Interned::new(path), generic_args } Path { type_anchor: None, mod_path: Interned::new(path), generic_args: generic_args.into() }
} }
pub fn kind(&self) -> &PathKind { pub fn kind(&self) -> &PathKind {
@ -187,7 +187,7 @@ impl Path {
pub fn segments(&self) -> PathSegments<'_> { pub fn segments(&self) -> PathSegments<'_> {
PathSegments { PathSegments {
segments: self.mod_path.segments.as_slice(), segments: self.mod_path.segments.as_slice(),
generic_args: self.generic_args.as_slice(), generic_args: &self.generic_args,
} }
} }
@ -205,14 +205,14 @@ impl Path {
self.mod_path.kind.clone(), self.mod_path.kind.clone(),
self.mod_path.segments[..self.mod_path.segments.len() - 1].iter().cloned(), self.mod_path.segments[..self.mod_path.segments.len() - 1].iter().cloned(),
)), )),
generic_args: self.generic_args[..self.generic_args.len() - 1].to_vec(), generic_args: self.generic_args[..self.generic_args.len() - 1].to_vec().into(),
}; };
Some(res) Some(res)
} }
pub fn is_self_type(&self) -> bool { pub fn is_self_type(&self) -> bool {
self.type_anchor.is_none() self.type_anchor.is_none()
&& self.generic_args == [None] && *self.generic_args == [None]
&& self.mod_path.as_ident() == Some(&name!(Self)) && self.mod_path.as_ident() == Some(&name!(Self))
} }
} }
@ -286,7 +286,7 @@ impl From<Name> for Path {
Path { Path {
type_anchor: None, type_anchor: None,
mod_path: Interned::new(ModPath::from_segments(PathKind::Plain, iter::once(name))), mod_path: Interned::new(ModPath::from_segments(PathKind::Plain, iter::once(name))),
generic_args: vec![None], generic_args: Box::new([None]),
} }
} }
} }

View File

@ -70,18 +70,13 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option<Path> {
} }
// <T as Trait<A>>::Foo desugars to Trait<Self=T, A>::Foo // <T as Trait<A>>::Foo desugars to Trait<Self=T, A>::Foo
Some(trait_ref) => { Some(trait_ref) => {
let path = Path::from_src(trait_ref.path()?, ctx)?; let Path { mod_path, generic_args: path_generic_args, .. } =
let mod_path = (*path.mod_path).clone(); Path::from_src(trait_ref.path()?, ctx)?;
let num_segments = path.mod_path.segments.len(); let num_segments = mod_path.segments.len();
kind = mod_path.kind; kind = mod_path.kind;
let mut prefix_segments = mod_path.segments; segments.extend(mod_path.segments.iter().cloned().rev());
prefix_segments.reverse(); generic_args.extend(path_generic_args.iter().cloned().rev());
segments.extend(prefix_segments);
let mut prefix_args = path.generic_args;
prefix_args.reverse();
generic_args.extend(prefix_args);
// Insert the type reference (T in the above example) as Self parameter for the trait // Insert the type reference (T in the above example) as Self parameter for the trait
let last_segment = let last_segment =
@ -139,7 +134,7 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option<Path> {
} }
let mod_path = Interned::new(ModPath::from_segments(kind, segments)); let mod_path = Interned::new(ModPath::from_segments(kind, segments));
return Some(Path { type_anchor, mod_path, generic_args }); return Some(Path { type_anchor, mod_path, generic_args: generic_args.into() });
fn qualifier(path: &ast::Path) -> Option<ast::Path> { fn qualifier(path: &ast::Path) -> Option<ast::Path> {
if let Some(q) = path.qualifier() { if let Some(q) = path.qualifier() {

View File

@ -202,19 +202,16 @@ impl ExprValidator {
} }
let is_method_call = matches!(expr, Expr::MethodCall { .. }); let is_method_call = matches!(expr, Expr::MethodCall { .. });
let (sig, args) = match expr { let (sig, mut arg_count) = match expr {
Expr::Call { callee, args } => { Expr::Call { callee, args } => {
let callee = &self.infer.type_of_expr[*callee]; let callee = &self.infer.type_of_expr[*callee];
let sig = match callee.callable_sig(db) { let sig = match callee.callable_sig(db) {
Some(sig) => sig, Some(sig) => sig,
None => return, None => return,
}; };
(sig, args.clone()) (sig, args.len())
} }
Expr::MethodCall { receiver, args, .. } => { Expr::MethodCall { receiver, args, .. } => {
let mut args = args.clone();
args.insert(0, *receiver);
let receiver = &self.infer.type_of_expr[*receiver]; let receiver = &self.infer.type_of_expr[*receiver];
if receiver.strip_references().is_unknown() { if receiver.strip_references().is_unknown() {
// if the receiver is of unknown type, it's very likely we // if the receiver is of unknown type, it's very likely we
@ -229,7 +226,7 @@ impl ExprValidator {
}; };
let sig = db.callable_item_signature(callee.into()).substitute(&Interner, &subst); let sig = db.callable_item_signature(callee.into()).substitute(&Interner, &subst);
(sig, args) (sig, args.len() + 1)
} }
_ => return, _ => return,
}; };
@ -241,7 +238,6 @@ impl ExprValidator {
let params = sig.params(); let params = sig.params();
let mut param_count = params.len(); let mut param_count = params.len();
let mut arg_count = args.len();
if arg_count != param_count { if arg_count != param_count {
if is_method_call { if is_method_call {

View File

@ -375,7 +375,7 @@ impl<'a> InferenceContext<'a> {
let matchee_diverges = self.diverges; let matchee_diverges = self.diverges;
let mut all_arms_diverge = Diverges::Always; let mut all_arms_diverge = Diverges::Always;
for arm in arms { for arm in arms.iter() {
self.diverges = Diverges::Maybe; self.diverges = Diverges::Maybe;
let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default()); let _pat_ty = self.infer_pat(arm.pat, &input_ty, BindingMode::default());
match arm.guard { match arm.guard {

View File

@ -226,8 +226,8 @@ impl<'a> InferenceContext<'a> {
_ => self.err_ty(), _ => self.err_ty(),
}; };
for pat_id in prefix.iter().chain(suffix) { for &pat_id in prefix.iter().chain(suffix.iter()) {
self.infer_pat(*pat_id, &elem_ty, default_bm); self.infer_pat(pat_id, &elem_ty, default_bm);
} }
let pat_ty = match expected.kind(&Interner) { let pat_ty = match expected.kind(&Interner) {
@ -235,8 +235,8 @@ impl<'a> InferenceContext<'a> {
_ => TyKind::Slice(elem_ty), _ => TyKind::Slice(elem_ty),
} }
.intern(&Interner); .intern(&Interner);
if let Some(slice_pat_id) = slice { if let &Some(slice_pat_id) = slice {
self.infer_pat(*slice_pat_id, &pat_ty, default_bm); self.infer_pat(slice_pat_id, &pat_ty, default_bm);
} }
pat_ty pat_ty