Fix ICE in repeat_once lint

This commit is contained in:
Eduardo Broto 2020-08-23 12:05:34 +02:00
parent dd07860b83
commit 8776db9f6d
2 changed files with 20 additions and 7 deletions

View file

@ -39,12 +39,12 @@ declare_lint_pass!(RepeatOnce => [REPEAT_ONCE]);
impl<'tcx> LateLintPass<'tcx> for RepeatOnce { impl<'tcx> LateLintPass<'tcx> for RepeatOnce {
fn check_expr(&mut self, cx: &LateContext<'_>, expr: &'tcx Expr<'_>) { fn check_expr(&mut self, cx: &LateContext<'_>, expr: &'tcx Expr<'_>) {
if_chain! { if_chain! {
if let ExprKind::MethodCall(ref path, _, ref args, _) = expr.kind; if let ExprKind::MethodCall(path, _, [receiver, count], _) = &expr.kind;
if path.ident.name == sym!(repeat); if path.ident.name == sym!(repeat);
if let Some(Constant::Int(1)) = constant_context(cx, cx.typeck_results()).expr(&args[1]); if let Some(Constant::Int(1)) = constant_context(cx, cx.typeck_results()).expr(&count);
if !in_macro(args[0].span); if !in_macro(receiver.span);
then { then {
let ty = walk_ptrs_ty(cx.typeck_results().expr_ty(&args[0])); let ty = walk_ptrs_ty(cx.typeck_results().expr_ty(&receiver));
if ty.is_str() { if ty.is_str() {
span_lint_and_sugg( span_lint_and_sugg(
cx, cx,
@ -52,7 +52,7 @@ impl<'tcx> LateLintPass<'tcx> for RepeatOnce {
expr.span, expr.span,
"calling `repeat(1)` on str", "calling `repeat(1)` on str",
"consider using `.to_string()` instead", "consider using `.to_string()` instead",
format!("{}.to_string()", snippet(cx, args[0].span, r#""...""#)), format!("{}.to_string()", snippet(cx, receiver.span, r#""...""#)),
Applicability::MachineApplicable, Applicability::MachineApplicable,
); );
} else if ty.builtin_index().is_some() { } else if ty.builtin_index().is_some() {
@ -62,7 +62,7 @@ impl<'tcx> LateLintPass<'tcx> for RepeatOnce {
expr.span, expr.span,
"calling `repeat(1)` on slice", "calling `repeat(1)` on slice",
"consider using `.to_vec()` instead", "consider using `.to_vec()` instead",
format!("{}.to_vec()", snippet(cx, args[0].span, r#""...""#)), format!("{}.to_vec()", snippet(cx, receiver.span, r#""...""#)),
Applicability::MachineApplicable, Applicability::MachineApplicable,
); );
} else if is_type_diagnostic_item(cx, ty, sym!(string_type)) { } else if is_type_diagnostic_item(cx, ty, sym!(string_type)) {
@ -72,7 +72,7 @@ impl<'tcx> LateLintPass<'tcx> for RepeatOnce {
expr.span, expr.span,
"calling `repeat(1)` on a string literal", "calling `repeat(1)` on a string literal",
"consider using `.clone()` instead", "consider using `.clone()` instead",
format!("{}.clone()", snippet(cx, args[0].span, r#""...""#)), format!("{}.clone()", snippet(cx, receiver.span, r#""...""#)),
Applicability::MachineApplicable, Applicability::MachineApplicable,
); );
} }

View file

@ -0,0 +1,13 @@
#![warn(clippy::repeat_once)]
trait Repeat {
fn repeat(&self) {}
}
impl Repeat for usize {
fn repeat(&self) {}
}
fn main() {
let _ = 42.repeat();
}