@@ -521,6 +521,52 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
521
521
}
522
522
}
523
523
}
524
+
525
+ // Suggest using `add`, `offset` or `offset_from` for pointer - {integer},
526
+ // pointer + {integer} or pointer - pointer.
527
+ if op. span . can_be_used_for_suggestions ( ) {
528
+ match op. node {
529
+ hir:: BinOpKind :: Add if lhs_ty. is_unsafe_ptr ( ) && rhs_ty. is_integral ( ) => {
530
+ err. multipart_suggestion (
531
+ "consider using `wrapping_add` or `add` for pointer + {integer}" ,
532
+ vec ! [
533
+ (
534
+ lhs_expr. span. between( rhs_expr. span) ,
535
+ ".wrapping_add(" . to_owned( ) ,
536
+ ) ,
537
+ ( rhs_expr. span. shrink_to_hi( ) , ")" . to_owned( ) ) ,
538
+ ] ,
539
+ Applicability :: MaybeIncorrect ,
540
+ ) ;
541
+ }
542
+ hir:: BinOpKind :: Sub => {
543
+ if lhs_ty. is_unsafe_ptr ( ) && rhs_ty. is_integral ( ) {
544
+ err. multipart_suggestion (
545
+ "consider using `wrapping_sub` or `sub` for pointer - {integer}" ,
546
+ vec ! [
547
+ ( lhs_expr. span. between( rhs_expr. span) , ".wrapping_sub(" . to_owned( ) ) ,
548
+ ( rhs_expr. span. shrink_to_hi( ) , ")" . to_owned( ) ) ,
549
+ ] ,
550
+ Applicability :: MaybeIncorrect
551
+ ) ;
552
+ }
553
+
554
+ if lhs_ty. is_unsafe_ptr ( ) && rhs_ty. is_unsafe_ptr ( ) {
555
+ err. multipart_suggestion (
556
+ "consider using `offset_from` for pointer - pointer if the pointers point to the same allocation" ,
557
+ vec ! [
558
+ ( lhs_expr. span. shrink_to_lo( ) , "unsafe { " . to_owned( ) ) ,
559
+ ( lhs_expr. span. between( rhs_expr. span) , ".offset_from(" . to_owned( ) ) ,
560
+ ( rhs_expr. span. shrink_to_hi( ) , ") }" . to_owned( ) ) ,
561
+ ] ,
562
+ Applicability :: MaybeIncorrect
563
+ ) ;
564
+ }
565
+ }
566
+ _ => { }
567
+ }
568
+ }
569
+
524
570
let reported = err. emit ( ) ;
525
571
self . tcx . ty_error ( reported)
526
572
}
0 commit comments