diff options
-rw-r--r-- | crates/ra_hir_ty/src/expr.rs | 17 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/tests.rs | 70 |
2 files changed, 86 insertions, 1 deletions
diff --git a/crates/ra_hir_ty/src/expr.rs b/crates/ra_hir_ty/src/expr.rs index 7532e2dc7..04668f486 100644 --- a/crates/ra_hir_ty/src/expr.rs +++ b/crates/ra_hir_ty/src/expr.rs | |||
@@ -329,13 +329,28 @@ pub fn unsafe_expressions( | |||
329 | match expr { | 329 | match expr { |
330 | Expr::Call { callee, .. } => { | 330 | Expr::Call { callee, .. } => { |
331 | if infer | 331 | if infer |
332 | .method_resolution(*callee) | 332 | .method_resolution(/* id */ *callee) |
333 | .map(|func| db.function_data(func).is_unsafe) | 333 | .map(|func| db.function_data(func).is_unsafe) |
334 | .unwrap_or(false) | 334 | .unwrap_or(false) |
335 | { | 335 | { |
336 | unsafe_expr_ids.push(id); | 336 | unsafe_expr_ids.push(id); |
337 | } | 337 | } |
338 | } | 338 | } |
339 | Expr::MethodCall {/*_receiver, method_name,*/ .. } => { | ||
340 | // let receiver_ty = &infer.type_of_expr[*receiver]; | ||
341 | // receiver_ty | ||
342 | if infer | ||
343 | .method_resolution(id) | ||
344 | .map(|func| { | ||
345 | db.function_data(func).is_unsafe | ||
346 | }) | ||
347 | .unwrap_or_else(|| { | ||
348 | false | ||
349 | }) | ||
350 | { | ||
351 | unsafe_expr_ids.push(id); | ||
352 | } | ||
353 | } | ||
339 | Expr::UnaryOp { expr, op: UnaryOp::Deref } => { | 354 | Expr::UnaryOp { expr, op: UnaryOp::Deref } => { |
340 | if let Ty::Apply(ApplicationTy { ctor: TypeCtor::RawPtr(..), .. }) = &infer[*expr] { | 355 | if let Ty::Apply(ApplicationTy { ctor: TypeCtor::RawPtr(..), .. }) = &infer[*expr] { |
341 | unsafe_expr_ids.push(id); | 356 | unsafe_expr_ids.push(id); |
diff --git a/crates/ra_hir_ty/src/tests.rs b/crates/ra_hir_ty/src/tests.rs index 4ff2b2d4a..c1f6fbab8 100644 --- a/crates/ra_hir_ty/src/tests.rs +++ b/crates/ra_hir_ty/src/tests.rs | |||
@@ -603,6 +603,76 @@ fn missing_unsafe() { | |||
603 | } | 603 | } |
604 | 604 | ||
605 | #[test] | 605 | #[test] |
606 | fn no_missing_unsafe_diagnostic_with_raw_ptr_in_unsafe_block() { | ||
607 | let diagnostics = TestDB::with_files( | ||
608 | r" | ||
609 | //- /lib.rs | ||
610 | fn nothing_to_see_move_along() { | ||
611 | unsafe { | ||
612 | let x = &5 as *usize; | ||
613 | let y = *x; | ||
614 | } | ||
615 | } | ||
616 | ", | ||
617 | ) | ||
618 | .diagnostics() | ||
619 | .0; | ||
620 | |||
621 | assert_snapshot!(diagnostics, @""); | ||
622 | } | ||
623 | |||
624 | #[test] | ||
625 | fn no_missing_unsafe_diagnostic_with_unsafe_call_in_unsafe_block() { | ||
626 | let diagnostics = TestDB::with_files( | ||
627 | r" | ||
628 | //- /lib.rs | ||
629 | unsafe fn unsafe_fn() { | ||
630 | let x = &5 as *usize; | ||
631 | let y = *x; | ||
632 | } | ||
633 | |||
634 | fn nothing_to_see_move_along() { | ||
635 | unsafe { | ||
636 | unsafe_fn(); | ||
637 | } | ||
638 | } | ||
639 | ", | ||
640 | ) | ||
641 | .diagnostics() | ||
642 | .0; | ||
643 | |||
644 | assert_snapshot!(diagnostics, @""); | ||
645 | } | ||
646 | |||
647 | #[test] | ||
648 | fn no_missing_unsafe_diagnostic_with_unsafe_method_call_in_unsafe_block() { | ||
649 | let diagnostics = TestDB::with_files( | ||
650 | r" | ||
651 | //- /lib.rs | ||
652 | struct HasUnsafe; | ||
653 | |||
654 | impl HasUnsafe { | ||
655 | unsafe fn unsafe_fn() { | ||
656 | let x = &5 as *usize; | ||
657 | let y = *x; | ||
658 | } | ||
659 | } | ||
660 | |||
661 | fn nothing_to_see_move_along() { | ||
662 | unsafe { | ||
663 | HasUnsafe.unsafe_fn(); | ||
664 | } | ||
665 | } | ||
666 | |||
667 | ", | ||
668 | ) | ||
669 | .diagnostics() | ||
670 | .0; | ||
671 | |||
672 | assert_snapshot!(diagnostics, @""); | ||
673 | } | ||
674 | |||
675 | #[test] | ||
606 | fn unnecessary_unsafe_diagnostic() { | 676 | fn unnecessary_unsafe_diagnostic() { |
607 | let diagnostics = TestDB::with_files( | 677 | let diagnostics = TestDB::with_files( |
608 | r" | 678 | r" |