1
- use rustc_ast:: InlineAsmTemplatePiece ;
1
+ use rustc_ast:: { InlineAsmOptions , InlineAsmTemplatePiece } ;
2
2
use rustc_data_structures:: fx:: FxIndexSet ;
3
3
use rustc_hir:: { self as hir, LangItem } ;
4
4
use rustc_middle:: bug;
@@ -124,7 +124,7 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
124
124
idx : usize ,
125
125
reg : InlineAsmRegOrRegClass ,
126
126
expr : & ' tcx hir:: Expr < ' tcx > ,
127
- template : & [ InlineAsmTemplatePiece ] ,
127
+ asm : & hir :: InlineAsm < ' tcx > ,
128
128
is_input : bool ,
129
129
tied_input : Option < ( & ' tcx hir:: Expr < ' tcx > , Option < InlineAsmType > ) > ,
130
130
target_features : & FxIndexSet < Symbol > ,
@@ -267,7 +267,7 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
267
267
// Search for any use of this operand without a modifier and emit
268
268
// the suggestion for them.
269
269
let mut spans = vec ! [ ] ;
270
- for piece in template {
270
+ for piece in asm . template {
271
271
if let & InlineAsmTemplatePiece :: Placeholder { operand_idx, modifier, span } = piece
272
272
{
273
273
if operand_idx == idx && modifier. is_none ( ) {
@@ -299,6 +299,24 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
299
299
}
300
300
}
301
301
302
+ if let ty:: RawPtr ( _, mutability) = * ty. kind ( ) {
303
+ let is_mut = match mutability {
304
+ hir:: Mutability :: Not => false ,
305
+ hir:: Mutability :: Mut => true ,
306
+ } ;
307
+
308
+ if is_mut && asm. options . contains ( InlineAsmOptions :: READONLY ) {
309
+ let msg = "Passing a mutable pointer to asm!() with 'readonly' option" ;
310
+ let note = "Mutable pointer suggest that this piece of assembly modifies the underlying object, consider using const pointer or checking the options" ;
311
+ self . tcx . dcx ( ) . struct_span_warn ( expr. span , msg) . with_note ( note) . emit ( ) ;
312
+ }
313
+ if asm. options . contains ( InlineAsmOptions :: NOMEM ) {
314
+ let msg = "Passing a pointer to asm!() with 'nomem' option" ;
315
+ let note = "Pointer suggest that this piece of assembly reads the underlying object, consider using usize or checking the options" ;
316
+ self . tcx . dcx ( ) . struct_span_warn ( expr. span , msg) . with_note ( note) . emit ( ) ;
317
+ }
318
+ }
319
+
302
320
Some ( asm_ty)
303
321
}
304
322
@@ -399,46 +417,30 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
399
417
400
418
match * op {
401
419
hir:: InlineAsmOperand :: In { reg, expr } => {
402
- self . check_asm_operand_type (
403
- idx,
404
- reg,
405
- expr,
406
- asm. template ,
407
- true ,
408
- None ,
409
- target_features,
410
- ) ;
420
+ self . check_asm_operand_type ( idx, reg, expr, asm, true , None , target_features) ;
411
421
}
412
422
hir:: InlineAsmOperand :: Out { reg, late : _, expr } => {
413
423
if let Some ( expr) = expr {
414
424
self . check_asm_operand_type (
415
425
idx,
416
426
reg,
417
427
expr,
418
- asm. template ,
428
+ asm,
419
429
false ,
420
430
None ,
421
431
target_features,
422
432
) ;
423
433
}
424
434
}
425
435
hir:: InlineAsmOperand :: InOut { reg, late : _, expr } => {
426
- self . check_asm_operand_type (
427
- idx,
428
- reg,
429
- expr,
430
- asm. template ,
431
- false ,
432
- None ,
433
- target_features,
434
- ) ;
436
+ self . check_asm_operand_type ( idx, reg, expr, asm, false , None , target_features) ;
435
437
}
436
438
hir:: InlineAsmOperand :: SplitInOut { reg, late : _, in_expr, out_expr } => {
437
439
let in_ty = self . check_asm_operand_type (
438
440
idx,
439
441
reg,
440
442
in_expr,
441
- asm. template ,
443
+ asm,
442
444
true ,
443
445
None ,
444
446
target_features,
@@ -448,7 +450,7 @@ impl<'a, 'tcx> InlineAsmCtxt<'a, 'tcx> {
448
450
idx,
449
451
reg,
450
452
out_expr,
451
- asm. template ,
453
+ asm,
452
454
false ,
453
455
Some ( ( in_expr, in_ty) ) ,
454
456
target_features,
0 commit comments