File tree 2 files changed +37
-1
lines changed
src/tools/rust-analyzer/crates
ide-diagnostics/src/handlers
2 files changed +37
-1
lines changed Original file line number Diff line number Diff line change @@ -180,14 +180,25 @@ impl InferenceContext<'_> {
180
180
self . infer_mut_expr ( index, Mutability :: Not ) ;
181
181
}
182
182
Expr :: UnaryOp { expr, op : UnaryOp :: Deref } => {
183
+ let mut mutability = mutability;
183
184
if let Some ( ( f, _) ) = self . result . method_resolutions . get_mut ( & tgt_expr) {
184
185
if mutability == Mutability :: Mut {
185
186
if let Some ( deref_trait) = self
186
187
. db
187
188
. lang_item ( self . table . trait_env . krate , LangItem :: DerefMut )
188
189
. and_then ( |l| l. as_trait ( ) )
189
190
{
190
- if let Some ( deref_fn) = self
191
+ let ty = self . result . type_of_expr . get ( * expr) ;
192
+ let is_mut_ptr = ty. is_some_and ( |ty| {
193
+ let ty = self . table . resolve_ty_shallow ( ty) ;
194
+ matches ! (
195
+ ty. kind( Interner ) ,
196
+ chalk_ir:: TyKind :: Raw ( Mutability :: Mut , _)
197
+ )
198
+ } ) ;
199
+ if is_mut_ptr {
200
+ mutability = Mutability :: Not ;
201
+ } else if let Some ( deref_fn) = self
191
202
. db
192
203
. trait_data ( deref_trait)
193
204
. method_by_name ( & Name :: new_symbol_root ( sym:: deref_mut. clone ( ) ) )
Original file line number Diff line number Diff line change @@ -1255,6 +1255,31 @@ pub unsafe fn foo(a: *mut A) {
1255
1255
//^^^^^ 💡 warn: variable does not need to be mutable
1256
1256
let _ = b();
1257
1257
}
1258
+ "# ,
1259
+ ) ;
1260
+ }
1261
+
1262
+ #[ test]
1263
+ fn regression_15799 ( ) {
1264
+ check_diagnostics (
1265
+ r#"
1266
+ //- minicore: deref_mut
1267
+ struct WrapPtr(*mut u32);
1268
+
1269
+ impl core::ops::Deref for WrapPtr {
1270
+ type Target = *mut u32;
1271
+ fn deref(&self) -> &Self::Target {
1272
+ &self.0
1273
+ }
1274
+ }
1275
+
1276
+ fn main() {
1277
+ let mut x = 0u32;
1278
+ let wrap = WrapPtr(&mut x);
1279
+ unsafe {
1280
+ **wrap = 6;
1281
+ }
1282
+ }
1258
1283
"# ,
1259
1284
) ;
1260
1285
}
You can’t perform that action at this time.
0 commit comments