1 // Exercise the unused_unsafe attribute in some positive and negative cases
8 // FIXME: Adapt -Zthir-unsafeck to behave the same as the mir version after #93678,
9 // then delete lint-unused-unsafe-thir.rs, and go back to using the settings below
10 // // revisions: mir thir
11 // // [thir]compile-flags: -Zthir-unsafeck
14 #![deny(unused_unsafe)]
23 fn callback<T, F>(_f: F) -> T where F: FnOnce() -> T { panic!() }
26 fn bad1() { unsafe {} } //~ ERROR: unnecessary `unsafe` block
27 fn bad2() { unsafe { bad1() } } //~ ERROR: unnecessary `unsafe` block
28 unsafe fn bad3() { unsafe {} } //~ ERROR: unnecessary `unsafe` block
29 fn bad4() { unsafe { callback(||{}) } } //~ ERROR: unnecessary `unsafe` block
30 unsafe fn bad5() { unsafe { unsf() } }
32 unsafe { //~ ERROR: unnecessary `unsafe` block
33 unsafe { // don't put the warning here
39 unsafe { //~ ERROR: unnecessary `unsafe` block
46 unsafe fn good0() { unsf() }
47 fn good1() { unsafe { unsf() } }
49 /* bug uncovered when implementing warning about unused unsafe blocks. Be
50 sure that when purity is inherited that the source of the unsafe-ness
51 is tracked correctly */
53 unsafe fn what() -> Vec<String> { panic!() }
61 unsafe fn good3() { foo::bar() }
62 fn good4() { unsafe { foo::bar() } }
64 #[allow(unused_unsafe)] fn allowed() { unsafe {} }
68 mod additional_tests {
74 unsafe { //~ ERROR: unnecessary `unsafe` block
75 #[allow(unused_unsafe)]
82 fn multi_level_unused() {
83 unsafe { //~ ERROR: unnecessary `unsafe` block
84 unsafe {} //~ ERROR: unnecessary `unsafe` block
85 unsafe {} //~ ERROR: unnecessary `unsafe` block
90 unsafe { //~ ERROR: unnecessary `unsafe` block
100 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
101 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
102 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
107 fn top_level_ignored() {
108 #[allow(unused_unsafe)]
110 #[deny(unused_unsafe)]
112 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
113 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
114 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
120 // same tests in unsafe fn without unsafe_op_in_unsafe_fn allowed
122 #[deny(unsafe_op_in_unsafe_fn)]
123 unsafe fn inner_ignored_1() {
124 unsafe { //~ ERROR: unnecessary `unsafe` block
125 #[allow(unused_unsafe)]
132 #[deny(unsafe_op_in_unsafe_fn)]
133 unsafe fn multi_level_unused_1() {
134 unsafe { //~ ERROR: unnecessary `unsafe` block
135 unsafe {} //~ ERROR: unnecessary `unsafe` block
136 unsafe {} //~ ERROR: unnecessary `unsafe` block
140 #[deny(unsafe_op_in_unsafe_fn)]
141 unsafe fn granularity_1() {
142 unsafe { //~ ERROR: unnecessary `unsafe` block
149 #[deny(unsafe_op_in_unsafe_fn)]
150 unsafe fn top_level_used_1() {
153 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
154 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
155 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
160 #[deny(unsafe_op_in_unsafe_fn)]
161 unsafe fn top_level_ignored_1() {
162 #[allow(unused_unsafe)]
164 #[deny(unused_unsafe)]
166 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
167 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
168 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
173 // same tests, but unsafe_op_in_unsafe_fn allowed,
174 // so that *all* unsafe blocks are unused
176 #[allow(unsafe_op_in_unsafe_fn)]
177 unsafe fn inner_ignored_2() {
178 unsafe { //~ ERROR: unnecessary `unsafe` block
179 #[allow(unused_unsafe)]
186 #[allow(unsafe_op_in_unsafe_fn)]
187 unsafe fn multi_level_unused_2() {
188 unsafe { //~ ERROR: unnecessary `unsafe` block
189 unsafe {} //~ ERROR: unnecessary `unsafe` block
190 unsafe {} //~ ERROR: unnecessary `unsafe` block
194 #[allow(unsafe_op_in_unsafe_fn)]
195 unsafe fn granularity_2() {
196 unsafe { //~ ERROR: unnecessary `unsafe` block
203 #[allow(unsafe_op_in_unsafe_fn)]
204 unsafe fn top_level_used_2() {
207 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
208 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
209 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
214 #[allow(unsafe_op_in_unsafe_fn)]
215 unsafe fn top_level_ignored_2() {
216 #[allow(unused_unsafe)]
218 #[deny(unused_unsafe)]
220 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
221 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
222 unsafe { unsf() } //~ ERROR: unnecessary `unsafe` block
227 // additional tests when using unsafe_op_in_unsafe_fn
228 // in more complex ways
230 #[allow(unsafe_op_in_unsafe_fn)]
231 unsafe fn granular_disallow_op_in_unsafe_fn() {
233 #[deny(unsafe_op_in_unsafe_fn)]
240 #[allow(unsafe_op_in_unsafe_fn)]
241 unsafe fn granular_disallow_op_in_unsafe_fn_2() {
242 unsafe { //~ ERROR: unnecessary `unsafe` block
244 #[deny(unsafe_op_in_unsafe_fn)]
252 #[allow(unsafe_op_in_unsafe_fn)]
253 unsafe fn granular_disallow_op_in_unsafe_fn_3() {
255 unsafe { //~ ERROR: unnecessary `unsafe` block
256 #[deny(unsafe_op_in_unsafe_fn)]
265 #[allow(unsafe_op_in_unsafe_fn)]
266 unsafe fn granular_disallow_op_in_unsafe_fn_4() {
268 unsafe { //~ ERROR: unnecessary `unsafe` block
271 #[deny(unsafe_op_in_unsafe_fn)]
279 // the same set of tests, with closures everywhere
280 mod additional_tests_closures {
286 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
287 #[allow(unused_unsafe)]
294 fn multi_level_unused() {
295 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
296 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
297 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
302 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
303 let _ = || unsafe { unsf() };
304 let _ = || unsafe { unsf() };
305 let _ = || unsafe { unsf() };
309 fn top_level_used() {
312 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
313 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
314 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
319 fn top_level_ignored() {
320 #[allow(unused_unsafe)]
322 #[deny(unused_unsafe)]
324 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
325 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
326 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
332 // same tests in unsafe fn without unsafe_op_in_unsafe_fn allowed
334 #[deny(unsafe_op_in_unsafe_fn)]
335 unsafe fn inner_ignored_1() {
336 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
337 #[allow(unused_unsafe)]
344 #[deny(unsafe_op_in_unsafe_fn)]
345 unsafe fn multi_level_unused_1() {
346 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
347 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
348 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
352 #[deny(unsafe_op_in_unsafe_fn)]
353 unsafe fn granularity_1() {
354 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
355 let _ = || unsafe { unsf() };
356 let _ = || unsafe { unsf() };
357 let _ = || unsafe { unsf() };
361 #[deny(unsafe_op_in_unsafe_fn)]
362 unsafe fn top_level_used_1() {
365 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
366 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
367 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
372 #[deny(unsafe_op_in_unsafe_fn)]
373 unsafe fn top_level_ignored_1() {
374 #[allow(unused_unsafe)]
376 #[deny(unused_unsafe)]
378 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
379 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
380 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
385 // same tests, but unsafe_op_in_unsafe_fn allowed,
386 // so that *all* unsafe blocks are unused
388 #[allow(unsafe_op_in_unsafe_fn)]
389 unsafe fn inner_ignored_2() {
390 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
391 #[allow(unused_unsafe)]
398 #[allow(unsafe_op_in_unsafe_fn)]
399 unsafe fn multi_level_unused_2() {
400 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
401 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
402 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
406 #[allow(unsafe_op_in_unsafe_fn)]
407 unsafe fn granularity_2() {
408 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
409 let _ = || unsafe { unsf() };
410 let _ = || unsafe { unsf() };
411 let _ = || unsafe { unsf() };
415 #[allow(unsafe_op_in_unsafe_fn)]
416 unsafe fn top_level_used_2() {
419 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
420 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
421 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
426 #[allow(unsafe_op_in_unsafe_fn)]
427 unsafe fn top_level_ignored_2() {
428 #[allow(unused_unsafe)]
430 #[deny(unused_unsafe)]
432 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
433 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
434 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
439 // additional tests when using unsafe_op_in_unsafe_fn
440 // in more complex ways
442 #[allow(unsafe_op_in_unsafe_fn)]
443 unsafe fn granular_disallow_op_in_unsafe_fn() {
445 #[deny(unsafe_op_in_unsafe_fn)]
452 #[allow(unsafe_op_in_unsafe_fn)]
453 unsafe fn granular_disallow_op_in_unsafe_fn_2() {
454 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
456 #[deny(unsafe_op_in_unsafe_fn)]
464 #[allow(unsafe_op_in_unsafe_fn)]
465 unsafe fn granular_disallow_op_in_unsafe_fn_3() {
467 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
468 #[deny(unsafe_op_in_unsafe_fn)]
477 #[allow(unsafe_op_in_unsafe_fn)]
478 unsafe fn granular_disallow_op_in_unsafe_fn_4() {
480 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
483 #[deny(unsafe_op_in_unsafe_fn)]
491 // the same set of tests, with closures everywhere
492 // and closures on the unsafe fn calls
493 mod additional_tests_even_more_closures {
499 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
500 #[allow(unused_unsafe)]
507 fn multi_level_unused() {
508 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
509 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
510 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
515 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
516 let _ = || unsafe { let _ = || unsf(); };
517 let _ = || unsafe { let _ = || unsf(); };
518 let _ = || unsafe { let _ = || unsf(); };
522 fn top_level_used() {
525 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
526 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
527 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
532 fn top_level_ignored() {
533 #[allow(unused_unsafe)]
535 #[deny(unused_unsafe)]
537 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
538 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
539 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
545 // same tests in unsafe fn without unsafe_op_in_unsafe_fn allowed
547 #[deny(unsafe_op_in_unsafe_fn)]
548 unsafe fn inner_ignored_1() {
549 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
550 #[allow(unused_unsafe)]
557 #[deny(unsafe_op_in_unsafe_fn)]
558 unsafe fn multi_level_unused_1() {
559 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
560 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
561 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
565 #[deny(unsafe_op_in_unsafe_fn)]
566 unsafe fn granularity_1() {
567 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
568 let _ = || unsafe { let _ = || unsf(); };
569 let _ = || unsafe { let _ = || unsf(); };
570 let _ = || unsafe { let _ = || unsf(); };
574 #[deny(unsafe_op_in_unsafe_fn)]
575 unsafe fn top_level_used_1() {
578 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
579 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
580 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
585 #[deny(unsafe_op_in_unsafe_fn)]
586 unsafe fn top_level_ignored_1() {
587 #[allow(unused_unsafe)]
589 #[deny(unused_unsafe)]
591 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
592 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
593 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
598 // same tests, but unsafe_op_in_unsafe_fn allowed,
599 // so that *all* unsafe blocks are unused
601 #[allow(unsafe_op_in_unsafe_fn)]
602 unsafe fn inner_ignored_2() {
603 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
604 #[allow(unused_unsafe)]
611 #[allow(unsafe_op_in_unsafe_fn)]
612 unsafe fn multi_level_unused_2() {
613 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
614 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
615 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
619 #[allow(unsafe_op_in_unsafe_fn)]
620 unsafe fn granularity_2() {
621 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
622 let _ = || unsafe { let _ = || unsf(); };
623 let _ = || unsafe { let _ = || unsf(); };
624 let _ = || unsafe { let _ = || unsf(); };
628 #[allow(unsafe_op_in_unsafe_fn)]
629 unsafe fn top_level_used_2() {
632 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
633 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
634 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
639 #[allow(unsafe_op_in_unsafe_fn)]
640 unsafe fn top_level_ignored_2() {
641 #[allow(unused_unsafe)]
643 #[deny(unused_unsafe)]
645 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
646 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
647 let _ = || unsafe { let _ = || unsf(); }; //~ ERROR: unnecessary `unsafe` block
652 // additional tests when using unsafe_op_in_unsafe_fn
653 // in more complex ways
655 #[allow(unsafe_op_in_unsafe_fn)]
656 unsafe fn granular_disallow_op_in_unsafe_fn() {
658 #[deny(unsafe_op_in_unsafe_fn)]
665 #[allow(unsafe_op_in_unsafe_fn)]
666 unsafe fn granular_disallow_op_in_unsafe_fn_2() {
667 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
669 #[deny(unsafe_op_in_unsafe_fn)]
677 #[allow(unsafe_op_in_unsafe_fn)]
678 unsafe fn granular_disallow_op_in_unsafe_fn_3() {
680 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
681 #[deny(unsafe_op_in_unsafe_fn)]
690 #[allow(unsafe_op_in_unsafe_fn)]
691 unsafe fn granular_disallow_op_in_unsafe_fn_4() {
693 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
696 #[deny(unsafe_op_in_unsafe_fn)]
709 #[deny(unsafe_op_in_unsafe_fn)]
710 unsafe fn inner_ignored_1() {
711 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
712 #[allow(unused_unsafe)]
719 #[deny(unsafe_op_in_unsafe_fn)]
720 unsafe fn multi_level_unused_1() {
721 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
722 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
723 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
727 #[deny(unsafe_op_in_unsafe_fn)]
728 unsafe fn granularity_1() {
729 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
730 let _ = || unsafe { unsf() };
731 let _ = || unsafe { unsf() };
732 let _ = || unsafe { unsf() };
736 #[deny(unsafe_op_in_unsafe_fn)]
737 unsafe fn top_level_used_1() {
740 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
741 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
742 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
747 #[deny(unsafe_op_in_unsafe_fn)]
748 unsafe fn top_level_ignored_1() {
749 #[allow(unused_unsafe)]
751 #[deny(unused_unsafe)]
753 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
754 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
755 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
760 // same tests, but unsafe_op_in_unsafe_fn allowed,
761 // so that *all* unsafe blocks are unused
763 #[allow(unsafe_op_in_unsafe_fn)]
764 unsafe fn inner_ignored_2() {
765 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
766 #[allow(unused_unsafe)]
773 #[allow(unsafe_op_in_unsafe_fn)]
774 unsafe fn multi_level_unused_2() {
775 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
776 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
777 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
781 #[allow(unsafe_op_in_unsafe_fn)]
782 unsafe fn granularity_2() {
783 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
784 let _ = || unsafe { unsf() };
785 let _ = || unsafe { unsf() };
786 let _ = || unsafe { unsf() };
790 #[allow(unsafe_op_in_unsafe_fn)]
791 unsafe fn top_level_used_2() {
794 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
795 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
796 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
801 #[allow(unsafe_op_in_unsafe_fn)]
802 unsafe fn top_level_ignored_2() {
803 #[allow(unused_unsafe)]
805 #[deny(unused_unsafe)]
807 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
808 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
809 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
814 // additional tests when using unsafe_op_in_unsafe_fn
815 // in more complex ways
817 #[allow(unsafe_op_in_unsafe_fn)]
818 unsafe fn granular_disallow_op_in_unsafe_fn() {
820 #[deny(unsafe_op_in_unsafe_fn)]
827 #[allow(unsafe_op_in_unsafe_fn)]
828 unsafe fn granular_disallow_op_in_unsafe_fn_2() {
829 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
831 #[deny(unsafe_op_in_unsafe_fn)]
839 #[allow(unsafe_op_in_unsafe_fn)]
840 unsafe fn granular_disallow_op_in_unsafe_fn_3() {
842 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
843 #[deny(unsafe_op_in_unsafe_fn)]
852 #[allow(unsafe_op_in_unsafe_fn)]
853 unsafe fn granular_disallow_op_in_unsafe_fn_4() {
855 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
858 #[deny(unsafe_op_in_unsafe_fn)]
867 #[deny(unsafe_op_in_unsafe_fn)]
868 unsafe fn inner_ignored_1() {
869 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
870 #[allow(unused_unsafe)]
877 #[deny(unsafe_op_in_unsafe_fn)]
878 unsafe fn multi_level_unused_1() {
879 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
880 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
881 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
885 #[deny(unsafe_op_in_unsafe_fn)]
886 unsafe fn granularity_1() {
887 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
888 let _ = || unsafe { unsf() };
889 let _ = || unsafe { unsf() };
890 let _ = || unsafe { unsf() };
894 #[deny(unsafe_op_in_unsafe_fn)]
895 unsafe fn top_level_used_1() {
898 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
899 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
900 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
905 #[deny(unsafe_op_in_unsafe_fn)]
906 unsafe fn top_level_ignored_1() {
907 #[allow(unused_unsafe)]
909 #[deny(unused_unsafe)]
911 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
912 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
913 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
918 // same tests, but unsafe_op_in_unsafe_fn allowed,
919 // so that *all* unsafe blocks are unused
921 #[allow(unsafe_op_in_unsafe_fn)]
922 unsafe fn inner_ignored_2() {
923 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
924 #[allow(unused_unsafe)]
931 #[allow(unsafe_op_in_unsafe_fn)]
932 unsafe fn multi_level_unused_2() {
933 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
934 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
935 let _ = || unsafe {}; //~ ERROR: unnecessary `unsafe` block
939 #[allow(unsafe_op_in_unsafe_fn)]
940 unsafe fn granularity_2() {
941 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
942 let _ = || unsafe { unsf() };
943 let _ = || unsafe { unsf() };
944 let _ = || unsafe { unsf() };
948 #[allow(unsafe_op_in_unsafe_fn)]
949 unsafe fn top_level_used_2() {
952 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
953 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
954 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
959 #[allow(unsafe_op_in_unsafe_fn)]
960 unsafe fn top_level_ignored_2() {
961 #[allow(unused_unsafe)]
963 #[deny(unused_unsafe)]
965 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
966 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
967 let _ = || unsafe { unsf() }; //~ ERROR: unnecessary `unsafe` block
972 // additional tests when using unsafe_op_in_unsafe_fn
973 // in more complex ways
975 #[allow(unsafe_op_in_unsafe_fn)]
976 unsafe fn granular_disallow_op_in_unsafe_fn() {
978 #[deny(unsafe_op_in_unsafe_fn)]
985 #[allow(unsafe_op_in_unsafe_fn)]
986 unsafe fn granular_disallow_op_in_unsafe_fn_2() {
987 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
989 #[deny(unsafe_op_in_unsafe_fn)]
997 #[allow(unsafe_op_in_unsafe_fn)]
998 unsafe fn granular_disallow_op_in_unsafe_fn_3() {
1000 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
1001 #[deny(unsafe_op_in_unsafe_fn)]
1010 #[allow(unsafe_op_in_unsafe_fn)]
1011 unsafe fn granular_disallow_op_in_unsafe_fn_4() {
1013 let _ = || unsafe { //~ ERROR: unnecessary `unsafe` block
1016 #[deny(unsafe_op_in_unsafe_fn)]
1025 mod additional_tests_extra {
1028 // multiple uses with different `unsafe_op_in_unsafe_fn` in the same closure
1029 #[allow(unsafe_op_in_unsafe_fn)]
1030 unsafe fn granular_disallow_op_in_unsafe_fn() {
1034 #[deny(unsafe_op_in_unsafe_fn)]
1042 #[warn(unsafe_op_in_unsafe_fn)]
1043 unsafe fn multiple_unsafe_op_in_unsafe_fn_allows() {
1045 #[allow(unsafe_op_in_unsafe_fn)]
1049 #[allow(unsafe_op_in_unsafe_fn)]
1056 async unsafe fn async_blocks() {
1057 #[deny(unsafe_op_in_unsafe_fn)]
1059 let _ = async { unsafe { //~ ERROR: unnecessary `unsafe` block
1060 let _ = async { unsafe { let _ = async { unsf() }; }};
1061 let _ = async { unsafe { let _ = async { unsf() }; }};
1062 let _ = async { unsafe { let _ = async { unsf() }; }};
1064 let _ = async { unsafe {
1065 let _ = async { unsf() };
1066 let _ = async { unsafe { let _ = async { unsf() }; }}; //~ ERROR: unnecessary `unsafe` block
1067 let _ = async { unsafe { let _ = async { unsf() }; }}; //~ ERROR: unnecessary `unsafe` block
1068 let _ = async { unsafe { let _ = async { unsf() }; }}; //~ ERROR: unnecessary `unsafe` block
1071 #[allow(unsafe_op_in_unsafe_fn)]
1073 let _ = async { unsafe { //~ ERROR: unnecessary `unsafe` block
1074 let _ = async { unsafe { let _ = async { unsf() }; }};
1075 let _ = async { unsafe { let _ = async { unsf() }; }};
1076 let _ = async { unsafe { let _ = async { unsf() }; }};
1078 let _ = async { unsafe {
1079 let _ = async { unsf() };
1080 let _ = async { unsafe { let _ = async { unsf() }; }}; //~ ERROR: unnecessary `unsafe` block
1081 let _ = async { unsafe { let _ = async { unsf() }; }}; //~ ERROR: unnecessary `unsafe` block
1082 let _ = async { unsafe { let _ = async { unsf() }; }}; //~ ERROR: unnecessary `unsafe` block
1087 fn used_unsafe_in_const() {
1088 let _x: [(); unsafe { size() }] = [];
1091 fn unused_unsafe_in_const_1() {
1092 let _x: [(); unsafe { 0 }] = []; //~ ERROR: unnecessary `unsafe` block
1095 fn unused_unsafe_in_const_2() {
1096 let _x: [(); unsafe { unsafe { size() } }] = []; //~ ERROR: unnecessary `unsafe` block
1099 const unsafe fn size() -> usize { 0 }