···233233 // and try again.
234234 Pattern::Assign { name, pattern } => {
235235 self.body.assign(name.clone(), check.var.clone());
236236- check.pattern = pattern.clone();
236236+ check.pattern = *pattern;
237237 continue;
238238 }
239239 // All other patterns are not unconditional, so we just keep them.
···341341 | Pattern::BitArray { .. }
342342 | Pattern::EmptyList => vec![],
343343344344- Pattern::StringPrefix { rest, .. } => vec![rest.clone()],
344344+ Pattern::StringPrefix { rest, .. } => vec![*rest],
345345346346 Pattern::Tuple { elements } => elements.clone(),
347347 Pattern::Constructor { arguments, .. } => arguments.clone(),
348348- Pattern::List { first, rest } => vec![first.clone(), rest.clone()],
348348+ Pattern::List { first, rest } => vec![*first, *rest],
349349 }
350350 }
351351}
···820820821821 // If the type is a tuple there's only one runtime check we could
822822 // perform that actually makes sense.
823823- BranchMode::Tuple { elems } => vec![self.is_tuple_check(&elems)],
823823+ BranchMode::Tuple { elems } => vec![self.is_tuple_check(elems)],
824824825825 // If the type being matched on is a list we know the resulting
826826 // decision tree node is only ever going to have two different paths: