@@ -2,7 +2,6 @@ use crate::build::ExprCategory;
2
2
use crate :: errors:: * ;
3
3
use rustc_middle:: thir:: visit:: { self , Visitor } ;
4
4
5
- use rustc_errors:: struct_span_err;
6
5
use rustc_hir as hir;
7
6
use rustc_middle:: mir:: BorrowKind ;
8
7
use rustc_middle:: thir:: * ;
@@ -13,7 +12,6 @@ use rustc_span::def_id::{DefId, LocalDefId};
13
12
use rustc_span:: symbol:: Symbol ;
14
13
use rustc_span:: Span ;
15
14
16
- use std:: borrow:: Cow ;
17
15
use std:: ops:: Bound ;
18
16
19
17
struct UnsafetyVisitor < ' a , ' tcx > {
@@ -88,19 +86,7 @@ impl<'tcx> UnsafetyVisitor<'_, 'tcx> {
88
86
kind. emit_unsafe_op_in_unsafe_fn_lint ( self . tcx , self . hir_context , span) ;
89
87
}
90
88
SafetyContext :: Safe => {
91
- let ( description, note) = kind. description_and_note ( self . tcx ) ;
92
- let fn_sugg = if unsafe_op_in_unsafe_fn_allowed { " function or" } else { "" } ;
93
- struct_span_err ! (
94
- self . tcx. sess,
95
- span,
96
- E0133 ,
97
- "{} is unsafe and requires unsafe{} block" ,
98
- description,
99
- fn_sugg,
100
- )
101
- . span_label ( span, kind. simple_description ( ) )
102
- . note ( note)
103
- . emit ( ) ;
89
+ kind. emit_requires_unsafe_err ( self . tcx , span, unsafe_op_in_unsafe_fn_allowed) ;
104
90
}
105
91
}
106
92
}
@@ -556,135 +542,161 @@ impl UnsafeOpKind {
556
542
UNSAFE_OP_IN_UNSAFE_FN ,
557
543
hir_id,
558
544
span,
559
- UnsafeOpInUnsafeUseOfInlineAssemblyRequiresUnsafe { span } ,
545
+ UnsafeOpInUnsafeFnUseOfInlineAssemblyRequiresUnsafe { span } ,
560
546
) ,
561
547
InitializingTypeWith => tcx. emit_spanned_lint (
562
548
UNSAFE_OP_IN_UNSAFE_FN ,
563
549
hir_id,
564
550
span,
565
- UnsafeOpInUnsafeInitializingTypeWithRequiresUnsafe { span } ,
551
+ UnsafeOpInUnsafeFnInitializingTypeWithRequiresUnsafe { span } ,
566
552
) ,
567
553
UseOfMutableStatic => tcx. emit_spanned_lint (
568
554
UNSAFE_OP_IN_UNSAFE_FN ,
569
555
hir_id,
570
556
span,
571
- UnsafeOpInUnsafeUseOfMutableStaticRequiresUnsafe { span } ,
557
+ UnsafeOpInUnsafeFnUseOfMutableStaticRequiresUnsafe { span } ,
572
558
) ,
573
559
UseOfExternStatic => tcx. emit_spanned_lint (
574
560
UNSAFE_OP_IN_UNSAFE_FN ,
575
561
hir_id,
576
562
span,
577
- UnsafeOpInUnsafeUseOfExternStaticRequiresUnsafe { span } ,
563
+ UnsafeOpInUnsafeFnUseOfExternStaticRequiresUnsafe { span } ,
578
564
) ,
579
565
DerefOfRawPointer => tcx. emit_spanned_lint (
580
566
UNSAFE_OP_IN_UNSAFE_FN ,
581
567
hir_id,
582
568
span,
583
- UnsafeOpInUnsafeDerefOfRawPointerRequiresUnsafe { span } ,
569
+ UnsafeOpInUnsafeFnDerefOfRawPointerRequiresUnsafe { span } ,
584
570
) ,
585
571
AccessToUnionField => tcx. emit_spanned_lint (
586
572
UNSAFE_OP_IN_UNSAFE_FN ,
587
573
hir_id,
588
574
span,
589
- UnsafeOpInUnsafeAccessToUnionFieldRequiresUnsafe { span } ,
575
+ UnsafeOpInUnsafeFnAccessToUnionFieldRequiresUnsafe { span } ,
590
576
) ,
591
577
MutationOfLayoutConstrainedField => tcx. emit_spanned_lint (
592
578
UNSAFE_OP_IN_UNSAFE_FN ,
593
579
hir_id,
594
580
span,
595
- UnsafeOpInUnsafeMutationOfLayoutConstrainedFieldRequiresUnsafe { span } ,
581
+ UnsafeOpInUnsafeFnMutationOfLayoutConstrainedFieldRequiresUnsafe { span } ,
596
582
) ,
597
583
BorrowOfLayoutConstrainedField => tcx. emit_spanned_lint (
598
584
UNSAFE_OP_IN_UNSAFE_FN ,
599
585
hir_id,
600
586
span,
601
- UnsafeOpInUnsafeBorrowOfLayoutConstrainedFieldRequiresUnsafe { span } ,
587
+ UnsafeOpInUnsafeFnBorrowOfLayoutConstrainedFieldRequiresUnsafe { span } ,
602
588
) ,
603
589
CallToFunctionWith ( did) => tcx. emit_spanned_lint (
604
590
UNSAFE_OP_IN_UNSAFE_FN ,
605
591
hir_id,
606
592
span,
607
- UnsafeOpInUnsafeCallToFunctionWithRequiresUnsafe {
593
+ UnsafeOpInUnsafeFnCallToFunctionWithRequiresUnsafe {
608
594
span,
609
595
function : & tcx. def_path_str ( * did) ,
610
596
} ,
611
597
) ,
612
598
}
613
599
}
614
600
615
- pub fn simple_description ( & self ) -> & ' static str {
601
+ pub fn emit_requires_unsafe_err (
602
+ & self ,
603
+ tcx : TyCtxt < ' _ > ,
604
+ span : Span ,
605
+ unsafe_op_in_unsafe_fn_allowed : bool ,
606
+ ) {
616
607
match self {
617
- CallToUnsafeFunction ( ..) => "call to unsafe function" ,
618
- UseOfInlineAssembly => "use of inline assembly" ,
619
- InitializingTypeWith => "initializing type with `rustc_layout_scalar_valid_range` attr" ,
620
- UseOfMutableStatic => "use of mutable static" ,
621
- UseOfExternStatic => "use of extern static" ,
622
- DerefOfRawPointer => "dereference of raw pointer" ,
623
- AccessToUnionField => "access to union field" ,
624
- MutationOfLayoutConstrainedField => "mutation of layout constrained field" ,
608
+ CallToUnsafeFunction ( did) if did. is_some ( ) && unsafe_op_in_unsafe_fn_allowed => {
609
+ tcx. sess . emit_err ( CallToUnsafeFunctionRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
610
+ span,
611
+ function : & tcx. def_path_str ( did. unwrap ( ) ) ,
612
+ } ) ;
613
+ }
614
+ CallToUnsafeFunction ( did) if did. is_some ( ) => {
615
+ tcx. sess . emit_err ( CallToUnsafeFunctionRequiresUnsafe {
616
+ span,
617
+ function : & tcx. def_path_str ( did. unwrap ( ) ) ,
618
+ } ) ;
619
+ }
620
+ CallToUnsafeFunction ( ..) if unsafe_op_in_unsafe_fn_allowed => {
621
+ tcx. sess . emit_err (
622
+ CallToUnsafeFunctionRequiresUnsafeNamelessUnsafeOpInUnsafeFnAllowed { span } ,
623
+ ) ;
624
+ }
625
+ CallToUnsafeFunction ( ..) => {
626
+ tcx. sess . emit_err ( CallToUnsafeFunctionRequiresUnsafeNameless { span } ) ;
627
+ }
628
+ UseOfInlineAssembly if unsafe_op_in_unsafe_fn_allowed => {
629
+ tcx. sess
630
+ . emit_err ( UseOfInlineAssemblyRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span } ) ;
631
+ }
632
+ UseOfInlineAssembly => {
633
+ tcx. sess . emit_err ( UseOfInlineAssemblyRequiresUnsafe { span } ) ;
634
+ }
635
+ InitializingTypeWith if unsafe_op_in_unsafe_fn_allowed => {
636
+ tcx. sess
637
+ . emit_err ( InitializingTypeWithRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span } ) ;
638
+ }
639
+ InitializingTypeWith => {
640
+ tcx. sess . emit_err ( InitializingTypeWithRequiresUnsafe { span } ) ;
641
+ }
642
+ UseOfMutableStatic if unsafe_op_in_unsafe_fn_allowed => {
643
+ tcx. sess
644
+ . emit_err ( UseOfMutableStaticRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span } ) ;
645
+ }
646
+ UseOfMutableStatic => {
647
+ tcx. sess . emit_err ( UseOfMutableStaticRequiresUnsafe { span } ) ;
648
+ }
649
+ UseOfExternStatic if unsafe_op_in_unsafe_fn_allowed => {
650
+ tcx. sess
651
+ . emit_err ( UseOfExternStaticRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span } ) ;
652
+ }
653
+ UseOfExternStatic => {
654
+ tcx. sess . emit_err ( UseOfExternStaticRequiresUnsafe { span } ) ;
655
+ }
656
+ DerefOfRawPointer if unsafe_op_in_unsafe_fn_allowed => {
657
+ tcx. sess
658
+ . emit_err ( DerefOfRawPointerRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span } ) ;
659
+ }
660
+ DerefOfRawPointer => {
661
+ tcx. sess . emit_err ( DerefOfRawPointerRequiresUnsafe { span } ) ;
662
+ }
663
+ AccessToUnionField if unsafe_op_in_unsafe_fn_allowed => {
664
+ tcx. sess
665
+ . emit_err ( AccessToUnionFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span } ) ;
666
+ }
667
+ AccessToUnionField => {
668
+ tcx. sess . emit_err ( AccessToUnionFieldRequiresUnsafe { span } ) ;
669
+ }
670
+ MutationOfLayoutConstrainedField if unsafe_op_in_unsafe_fn_allowed => {
671
+ tcx. sess . emit_err (
672
+ MutationOfLayoutConstrainedFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
673
+ span,
674
+ } ,
675
+ ) ;
676
+ }
677
+ MutationOfLayoutConstrainedField => {
678
+ tcx. sess . emit_err ( MutationOfLayoutConstrainedFieldRequiresUnsafe { span } ) ;
679
+ }
680
+ BorrowOfLayoutConstrainedField if unsafe_op_in_unsafe_fn_allowed => {
681
+ tcx. sess . emit_err (
682
+ BorrowOfLayoutConstrainedFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed { span } ,
683
+ ) ;
684
+ }
625
685
BorrowOfLayoutConstrainedField => {
626
- "borrow of layout constrained field with interior mutability"
686
+ tcx. sess . emit_err ( BorrowOfLayoutConstrainedFieldRequiresUnsafe { span } ) ;
687
+ }
688
+ CallToFunctionWith ( did) if unsafe_op_in_unsafe_fn_allowed => {
689
+ tcx. sess . emit_err ( CallToFunctionWithRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
690
+ span,
691
+ function : & tcx. def_path_str ( * did) ,
692
+ } ) ;
693
+ }
694
+ CallToFunctionWith ( did) => {
695
+ tcx. sess . emit_err ( CallToFunctionWithRequiresUnsafe {
696
+ span,
697
+ function : & tcx. def_path_str ( * did) ,
698
+ } ) ;
627
699
}
628
- CallToFunctionWith ( ..) => "call to function with `#[target_feature]`" ,
629
- }
630
- }
631
-
632
- pub fn description_and_note ( & self , tcx : TyCtxt < ' _ > ) -> ( Cow < ' static , str > , & ' static str ) {
633
- match self {
634
- CallToUnsafeFunction ( did) => (
635
- if let Some ( did) = did {
636
- Cow :: from ( format ! ( "call to unsafe function `{}`" , tcx. def_path_str( * did) ) )
637
- } else {
638
- Cow :: Borrowed ( self . simple_description ( ) )
639
- } ,
640
- "consult the function's documentation for information on how to avoid undefined \
641
- behavior",
642
- ) ,
643
- UseOfInlineAssembly => (
644
- Cow :: Borrowed ( self . simple_description ( ) ) ,
645
- "inline assembly is entirely unchecked and can cause undefined behavior" ,
646
- ) ,
647
- InitializingTypeWith => (
648
- Cow :: Borrowed ( self . simple_description ( ) ) ,
649
- "initializing a layout restricted type's field with a value outside the valid \
650
- range is undefined behavior",
651
- ) ,
652
- UseOfMutableStatic => (
653
- Cow :: Borrowed ( self . simple_description ( ) ) ,
654
- "mutable statics can be mutated by multiple threads: aliasing violations or data \
655
- races will cause undefined behavior",
656
- ) ,
657
- UseOfExternStatic => (
658
- Cow :: Borrowed ( self . simple_description ( ) ) ,
659
- "extern statics are not controlled by the Rust type system: invalid data, \
660
- aliasing violations or data races will cause undefined behavior",
661
- ) ,
662
- DerefOfRawPointer => (
663
- Cow :: Borrowed ( self . simple_description ( ) ) ,
664
- "raw pointers may be null, dangling or unaligned; they can violate aliasing rules \
665
- and cause data races: all of these are undefined behavior",
666
- ) ,
667
- AccessToUnionField => (
668
- Cow :: Borrowed ( self . simple_description ( ) ) ,
669
- "the field may not be properly initialized: using uninitialized data will cause \
670
- undefined behavior",
671
- ) ,
672
- MutationOfLayoutConstrainedField => (
673
- Cow :: Borrowed ( self . simple_description ( ) ) ,
674
- "mutating layout constrained fields cannot statically be checked for valid values" ,
675
- ) ,
676
- BorrowOfLayoutConstrainedField => (
677
- Cow :: Borrowed ( self . simple_description ( ) ) ,
678
- "references to fields of layout constrained fields lose the constraints. Coupled \
679
- with interior mutability, the field can be changed to invalid values",
680
- ) ,
681
- CallToFunctionWith ( did) => (
682
- Cow :: from ( format ! (
683
- "call to function `{}` with `#[target_feature]`" ,
684
- tcx. def_path_str( * did)
685
- ) ) ,
686
- "can only be called if the required target features are available" ,
687
- ) ,
688
700
}
689
701
}
690
702
}
0 commit comments