mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Add suggestion to THIR unsafe_op_in_unsafe_fn lint
This commit is contained in:
parent
2b2c0f9886
commit
2b59992736
@ -3566,6 +3566,15 @@ impl<'hir> OwnerNode<'hir> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn fn_sig(self) -> Option<&'hir FnSig<'hir>> {
|
||||
match self {
|
||||
OwnerNode::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
|
||||
| OwnerNode::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
|
||||
| OwnerNode::Item(Item { kind: ItemKind::Fn(fn_sig, _, _), .. }) => Some(fn_sig),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn fn_decl(self) -> Option<&'hir FnDecl<'hir>> {
|
||||
match self {
|
||||
OwnerNode::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
|
||||
|
@ -320,6 +320,7 @@ mir_build_unreachable_pattern = unreachable pattern
|
||||
.label = unreachable pattern
|
||||
.catchall_label = matches any value
|
||||
|
||||
mir_build_unsafe_fn_safe_body = an unsafe function restricts its caller, but its body is safe by default
|
||||
mir_build_unsafe_not_inherited = items do not inherit unsafety from separate enclosing items
|
||||
|
||||
mir_build_unsafe_op_in_unsafe_fn_borrow_of_layout_constrained_field_requires_unsafe =
|
||||
@ -386,3 +387,5 @@ mir_build_unused_unsafe = unnecessary `unsafe` block
|
||||
mir_build_unused_unsafe_enclosing_block_label = because it's nested under this `unsafe` block
|
||||
|
||||
mir_build_variant_defined_here = not covered
|
||||
|
||||
mir_build_wrap_suggestion = consider wrapping the function body in an unsafe block
|
||||
|
@ -35,6 +35,10 @@ struct UnsafetyVisitor<'a, 'tcx> {
|
||||
param_env: ParamEnv<'tcx>,
|
||||
inside_adt: bool,
|
||||
warnings: &'a mut Vec<UnusedUnsafeWarning>,
|
||||
|
||||
/// Flag to ensure that we only suggest wrapping the entire function body in
|
||||
/// an unsafe block once.
|
||||
suggest_unsafe_block: bool,
|
||||
}
|
||||
|
||||
impl<'tcx> UnsafetyVisitor<'_, 'tcx> {
|
||||
@ -95,7 +99,13 @@ impl<'tcx> UnsafetyVisitor<'_, 'tcx> {
|
||||
SafetyContext::UnsafeFn if unsafe_op_in_unsafe_fn_allowed => {}
|
||||
SafetyContext::UnsafeFn => {
|
||||
// unsafe_op_in_unsafe_fn is disallowed
|
||||
kind.emit_unsafe_op_in_unsafe_fn_lint(self.tcx, self.hir_context, span);
|
||||
kind.emit_unsafe_op_in_unsafe_fn_lint(
|
||||
self.tcx,
|
||||
self.hir_context,
|
||||
span,
|
||||
self.suggest_unsafe_block,
|
||||
);
|
||||
self.suggest_unsafe_block = false;
|
||||
}
|
||||
SafetyContext::Safe => {
|
||||
kind.emit_requires_unsafe_err(
|
||||
@ -297,6 +307,7 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
|
||||
}
|
||||
PatKind::InlineConstant { def, .. } => {
|
||||
self.visit_inner_body(*def);
|
||||
visit::walk_pat(self, pat);
|
||||
}
|
||||
_ => {
|
||||
visit::walk_pat(self, pat);
|
||||
@ -545,7 +556,22 @@ impl UnsafeOpKind {
|
||||
tcx: TyCtxt<'_>,
|
||||
hir_id: hir::HirId,
|
||||
span: Span,
|
||||
suggest_unsafe_block: bool,
|
||||
) {
|
||||
let parent_id = tcx.hir().get_parent_item(hir_id);
|
||||
let parent_owner = tcx.hir().owner(parent_id);
|
||||
let should_suggest = parent_owner.fn_sig().map_or(false, |sig| sig.header.is_unsafe());
|
||||
let unsafe_not_inherited_note = if should_suggest {
|
||||
suggest_unsafe_block.then(|| {
|
||||
let body_span = tcx.hir().body(parent_owner.body_id().unwrap()).value.span;
|
||||
UnsafeNotInheritedLintNote {
|
||||
signature_span: tcx.def_span(parent_id.def_id),
|
||||
body_span,
|
||||
}
|
||||
})
|
||||
} else {
|
||||
None
|
||||
};
|
||||
// FIXME: ideally we would want to trim the def paths, but this is not
|
||||
// feasible with the current lint emission API (see issue #106126).
|
||||
match self {
|
||||
@ -556,61 +582,89 @@ impl UnsafeOpKind {
|
||||
UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafe {
|
||||
span,
|
||||
function: &with_no_trimmed_paths!(tcx.def_path_str(*did)),
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
CallToUnsafeFunction(None) => tcx.emit_spanned_lint(
|
||||
UNSAFE_OP_IN_UNSAFE_FN,
|
||||
hir_id,
|
||||
span,
|
||||
UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafeNameless { span },
|
||||
UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafeNameless {
|
||||
span,
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
UseOfInlineAssembly => tcx.emit_spanned_lint(
|
||||
UNSAFE_OP_IN_UNSAFE_FN,
|
||||
hir_id,
|
||||
span,
|
||||
UnsafeOpInUnsafeFnUseOfInlineAssemblyRequiresUnsafe { span },
|
||||
UnsafeOpInUnsafeFnUseOfInlineAssemblyRequiresUnsafe {
|
||||
span,
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
InitializingTypeWith => tcx.emit_spanned_lint(
|
||||
UNSAFE_OP_IN_UNSAFE_FN,
|
||||
hir_id,
|
||||
span,
|
||||
UnsafeOpInUnsafeFnInitializingTypeWithRequiresUnsafe { span },
|
||||
UnsafeOpInUnsafeFnInitializingTypeWithRequiresUnsafe {
|
||||
span,
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
UseOfMutableStatic => tcx.emit_spanned_lint(
|
||||
UNSAFE_OP_IN_UNSAFE_FN,
|
||||
hir_id,
|
||||
span,
|
||||
UnsafeOpInUnsafeFnUseOfMutableStaticRequiresUnsafe { span },
|
||||
UnsafeOpInUnsafeFnUseOfMutableStaticRequiresUnsafe {
|
||||
span,
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
UseOfExternStatic => tcx.emit_spanned_lint(
|
||||
UNSAFE_OP_IN_UNSAFE_FN,
|
||||
hir_id,
|
||||
span,
|
||||
UnsafeOpInUnsafeFnUseOfExternStaticRequiresUnsafe { span },
|
||||
UnsafeOpInUnsafeFnUseOfExternStaticRequiresUnsafe {
|
||||
span,
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
DerefOfRawPointer => tcx.emit_spanned_lint(
|
||||
UNSAFE_OP_IN_UNSAFE_FN,
|
||||
hir_id,
|
||||
span,
|
||||
UnsafeOpInUnsafeFnDerefOfRawPointerRequiresUnsafe { span },
|
||||
UnsafeOpInUnsafeFnDerefOfRawPointerRequiresUnsafe {
|
||||
span,
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
AccessToUnionField => tcx.emit_spanned_lint(
|
||||
UNSAFE_OP_IN_UNSAFE_FN,
|
||||
hir_id,
|
||||
span,
|
||||
UnsafeOpInUnsafeFnAccessToUnionFieldRequiresUnsafe { span },
|
||||
UnsafeOpInUnsafeFnAccessToUnionFieldRequiresUnsafe {
|
||||
span,
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
MutationOfLayoutConstrainedField => tcx.emit_spanned_lint(
|
||||
UNSAFE_OP_IN_UNSAFE_FN,
|
||||
hir_id,
|
||||
span,
|
||||
UnsafeOpInUnsafeFnMutationOfLayoutConstrainedFieldRequiresUnsafe { span },
|
||||
UnsafeOpInUnsafeFnMutationOfLayoutConstrainedFieldRequiresUnsafe {
|
||||
span,
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
BorrowOfLayoutConstrainedField => tcx.emit_spanned_lint(
|
||||
UNSAFE_OP_IN_UNSAFE_FN,
|
||||
hir_id,
|
||||
span,
|
||||
UnsafeOpInUnsafeFnBorrowOfLayoutConstrainedFieldRequiresUnsafe { span },
|
||||
UnsafeOpInUnsafeFnBorrowOfLayoutConstrainedFieldRequiresUnsafe {
|
||||
span,
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
CallToFunctionWith(did) => tcx.emit_spanned_lint(
|
||||
UNSAFE_OP_IN_UNSAFE_FN,
|
||||
@ -619,6 +673,7 @@ impl UnsafeOpKind {
|
||||
UnsafeOpInUnsafeFnCallToFunctionWithRequiresUnsafe {
|
||||
span,
|
||||
function: &with_no_trimmed_paths!(tcx.def_path_str(*did)),
|
||||
unsafe_not_inherited_note,
|
||||
},
|
||||
),
|
||||
}
|
||||
@ -833,6 +888,7 @@ pub fn thir_check_unsafety(tcx: TyCtxt<'_>, def: LocalDefId) {
|
||||
param_env: tcx.param_env(def),
|
||||
inside_adt: false,
|
||||
warnings: &mut warnings,
|
||||
suggest_unsafe_block: true,
|
||||
};
|
||||
visitor.visit_expr(&thir[expr]);
|
||||
|
||||
|
@ -29,6 +29,8 @@ pub struct UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafe<'a> {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
pub function: &'a str,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
@ -37,6 +39,8 @@ pub struct UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafe<'a> {
|
||||
pub struct UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafeNameless {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
@ -45,6 +49,8 @@ pub struct UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafeNameless {
|
||||
pub struct UnsafeOpInUnsafeFnUseOfInlineAssemblyRequiresUnsafe {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
@ -53,6 +59,8 @@ pub struct UnsafeOpInUnsafeFnUseOfInlineAssemblyRequiresUnsafe {
|
||||
pub struct UnsafeOpInUnsafeFnInitializingTypeWithRequiresUnsafe {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
@ -61,6 +69,8 @@ pub struct UnsafeOpInUnsafeFnInitializingTypeWithRequiresUnsafe {
|
||||
pub struct UnsafeOpInUnsafeFnUseOfMutableStaticRequiresUnsafe {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
@ -69,6 +79,8 @@ pub struct UnsafeOpInUnsafeFnUseOfMutableStaticRequiresUnsafe {
|
||||
pub struct UnsafeOpInUnsafeFnUseOfExternStaticRequiresUnsafe {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
@ -77,6 +89,8 @@ pub struct UnsafeOpInUnsafeFnUseOfExternStaticRequiresUnsafe {
|
||||
pub struct UnsafeOpInUnsafeFnDerefOfRawPointerRequiresUnsafe {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
@ -85,6 +99,8 @@ pub struct UnsafeOpInUnsafeFnDerefOfRawPointerRequiresUnsafe {
|
||||
pub struct UnsafeOpInUnsafeFnAccessToUnionFieldRequiresUnsafe {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
@ -93,6 +109,8 @@ pub struct UnsafeOpInUnsafeFnAccessToUnionFieldRequiresUnsafe {
|
||||
pub struct UnsafeOpInUnsafeFnMutationOfLayoutConstrainedFieldRequiresUnsafe {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
@ -100,6 +118,8 @@ pub struct UnsafeOpInUnsafeFnMutationOfLayoutConstrainedFieldRequiresUnsafe {
|
||||
pub struct UnsafeOpInUnsafeFnBorrowOfLayoutConstrainedFieldRequiresUnsafe {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
@ -109,6 +129,8 @@ pub struct UnsafeOpInUnsafeFnCallToFunctionWithRequiresUnsafe<'a> {
|
||||
#[label]
|
||||
pub span: Span,
|
||||
pub function: &'a str,
|
||||
#[subdiagnostic]
|
||||
pub unsafe_not_inherited_note: Option<UnsafeNotInheritedLintNote>,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
@ -376,6 +398,27 @@ pub struct UnsafeNotInheritedNote {
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
pub struct UnsafeNotInheritedLintNote {
|
||||
pub signature_span: Span,
|
||||
pub body_span: Span,
|
||||
}
|
||||
|
||||
impl AddToDiagnostic for UnsafeNotInheritedLintNote {
|
||||
fn add_to_diagnostic_with<F>(self, diag: &mut Diagnostic, _: F)
|
||||
where
|
||||
F: Fn(&mut Diagnostic, SubdiagnosticMessage) -> SubdiagnosticMessage,
|
||||
{
|
||||
diag.span_note(self.signature_span, fluent::mir_build_unsafe_fn_safe_body);
|
||||
let body_start = self.body_span.shrink_to_lo();
|
||||
let body_end = self.body_span.shrink_to_hi();
|
||||
diag.tool_only_multipart_suggestion(
|
||||
fluent::mir_build_wrap_suggestion,
|
||||
vec![(body_start, "{ unsafe ".into()), (body_end, "}".into())],
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(mir_build_unused_unsafe)]
|
||||
pub struct UnusedUnsafe {
|
||||
|
@ -1,12 +1,12 @@
|
||||
warning: call to unsafe function is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/edition-2024-unsafe_op_in_unsafe_fn.rs:12:5
|
||||
--> $DIR/edition-2024-unsafe_op_in_unsafe_fn.rs:13:5
|
||||
|
|
||||
LL | unsf();
|
||||
| ^^^^^^ call to unsafe function
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/edition-2024-unsafe_op_in_unsafe_fn.rs:11:1
|
||||
--> $DIR/edition-2024-unsafe_op_in_unsafe_fn.rs:12:1
|
||||
|
|
||||
LL | unsafe fn foo() {
|
||||
| ^^^^^^^^^^^^^^^
|
@ -1,17 +1,21 @@
|
||||
// edition: 2024
|
||||
// compile-flags: -Zunstable-options
|
||||
// check-pass
|
||||
// revisions: mir thir
|
||||
// [thir]compile-flags: -Zthir-unsafeck
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
#![deny(unused_unsafe)]
|
||||
|
||||
unsafe fn unsf() {}
|
||||
|
||||
unsafe fn foo() {
|
||||
unsf();
|
||||
//~^ WARN call to unsafe function is unsafe and requires unsafe block
|
||||
//[mir]~^ WARN call to unsafe function is unsafe and requires unsafe block
|
||||
//[thir]~^^ WARN call to unsafe function `unsf` is unsafe and requires unsafe block
|
||||
|
||||
// no unused_unsafe
|
||||
unsafe { unsf(); }
|
||||
unsafe {
|
||||
unsf();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,16 @@
|
||||
warning: call to unsafe function `unsf` is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/edition-2024-unsafe_op_in_unsafe_fn.rs:13:5
|
||||
|
|
||||
LL | unsf();
|
||||
| ^^^^^^ call to unsafe function
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/edition-2024-unsafe_op_in_unsafe_fn.rs:12:1
|
||||
|
|
||||
LL | unsafe fn foo() {
|
||||
| ^^^^^^^^^^^^^^^
|
||||
= note: `#[warn(unsafe_op_in_unsafe_fn)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
@ -5,6 +5,11 @@ LL | unsf();
|
||||
| ^^^^^^ call to unsafe function
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:11:1
|
||||
|
|
||||
LL | unsafe fn deny_level() {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: the lint level is defined here
|
||||
--> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:4:9
|
||||
|
|
||||
@ -46,6 +51,11 @@ LL | unsf();
|
||||
| ^^^^^^ call to unsafe function
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:27:1
|
||||
|
|
||||
LL | unsafe fn warning_level() {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
note: the lint level is defined here
|
||||
--> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:26:8
|
||||
|
|
||||
|
@ -1,7 +1,10 @@
|
||||
// run-rustfix
|
||||
// aux-build:external_unsafe_macro.rs
|
||||
// revisions: mir thir
|
||||
// [thir]compile-flags: -Zthir-unsafeck
|
||||
|
||||
#![deny(unsafe_op_in_unsafe_fn)] //~ NOTE
|
||||
#![crate_name = "wrapping_unsafe_block_sugg"]
|
||||
|
||||
extern crate external_unsafe_macro;
|
||||
|
||||
@ -9,11 +12,13 @@ unsafe fn unsf() {}
|
||||
|
||||
pub unsafe fn foo() { unsafe {
|
||||
//~^ NOTE an unsafe function restricts its caller, but its body is safe by default
|
||||
unsf(); //~ ERROR call to unsafe function is unsafe
|
||||
//~^ NOTE
|
||||
unsf(); //[mir]~ ERROR call to unsafe function is unsafe
|
||||
//[thir]~^ ERROR call to unsafe function `unsf` is unsafe
|
||||
//~^^ NOTE
|
||||
//~| NOTE
|
||||
unsf(); //~ ERROR call to unsafe function is unsafe
|
||||
//~^ NOTE
|
||||
unsf(); //[mir]~ ERROR call to unsafe function is unsafe
|
||||
//[thir]~^ ERROR call to unsafe function `unsf` is unsafe
|
||||
//~^^ NOTE
|
||||
//~| NOTE
|
||||
}}
|
||||
|
||||
@ -39,10 +44,12 @@ pub unsafe fn baz() -> i32 { unsafe {
|
||||
}}
|
||||
|
||||
macro_rules! unsafe_macro { () => (unsf()) }
|
||||
//~^ ERROR call to unsafe function is unsafe
|
||||
//[mir]~^ ERROR call to unsafe function is unsafe
|
||||
//[thir]~^^ ERROR call to unsafe function `unsf` is unsafe
|
||||
//~| NOTE
|
||||
//~| NOTE
|
||||
//~| ERROR call to unsafe function is unsafe
|
||||
//[mir]~| ERROR call to unsafe function is unsafe
|
||||
//[thir]~| ERROR call to unsafe function `unsf` is unsafe
|
||||
//~| NOTE
|
||||
//~| NOTE
|
||||
|
@ -1,21 +1,3 @@
|
||||
error: call to unsafe function is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:12:5
|
||||
|
|
||||
LL | unsf();
|
||||
| ^^^^^^ call to unsafe function
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:10:1
|
||||
|
|
||||
LL | pub unsafe fn foo() {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
note: the lint level is defined here
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:4:9
|
||||
|
|
||||
LL | #![deny(unsafe_op_in_unsafe_fn)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: call to unsafe function is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:15:5
|
||||
|
|
||||
@ -23,22 +5,40 @@ LL | unsf();
|
||||
| ^^^^^^ call to unsafe function
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:13:1
|
||||
|
|
||||
LL | pub unsafe fn foo() {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
note: the lint level is defined here
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:6:9
|
||||
|
|
||||
LL | #![deny(unsafe_op_in_unsafe_fn)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: call to unsafe function is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:19:5
|
||||
|
|
||||
LL | unsf();
|
||||
| ^^^^^^ call to unsafe function
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
|
||||
error: dereference of raw pointer is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:22:13
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:27:13
|
||||
|
|
||||
LL | let y = *x;
|
||||
| ^^ dereference of raw pointer
|
||||
|
|
||||
= note: raw pointers may be null, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:20:1
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:25:1
|
||||
|
|
||||
LL | pub unsafe fn bar(x: *const i32) -> i32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: dereference of raw pointer is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:25:9
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:30:9
|
||||
|
|
||||
LL | y + *x
|
||||
| ^^ dereference of raw pointer
|
||||
@ -46,20 +46,20 @@ LL | y + *x
|
||||
= note: raw pointers may be null, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
|
||||
|
||||
error: use of mutable static is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:33:13
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:38:13
|
||||
|
|
||||
LL | let y = BAZ;
|
||||
| ^^^ use of mutable static
|
||||
|
|
||||
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:31:1
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:36:1
|
||||
|
|
||||
LL | pub unsafe fn baz() -> i32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: use of mutable static is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:36:9
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:41:9
|
||||
|
|
||||
LL | y + BAZ
|
||||
| ^^^ use of mutable static
|
||||
@ -67,7 +67,7 @@ LL | y + BAZ
|
||||
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
|
||||
|
||||
error: call to unsafe function is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:41:36
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:46:36
|
||||
|
|
||||
LL | macro_rules! unsafe_macro { () => (unsf()) }
|
||||
| ^^^^^^ call to unsafe function
|
||||
@ -77,14 +77,14 @@ LL | unsafe_macro!();
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:49:1
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:56:1
|
||||
|
|
||||
LL | pub unsafe fn unsafe_in_macro() {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in the macro `unsafe_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: call to unsafe function is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:41:36
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:46:36
|
||||
|
|
||||
LL | macro_rules! unsafe_macro { () => (unsf()) }
|
||||
| ^^^^^^ call to unsafe function
|
@ -1,7 +1,10 @@
|
||||
// run-rustfix
|
||||
// aux-build:external_unsafe_macro.rs
|
||||
// revisions: mir thir
|
||||
// [thir]compile-flags: -Zthir-unsafeck
|
||||
|
||||
#![deny(unsafe_op_in_unsafe_fn)] //~ NOTE
|
||||
#![crate_name = "wrapping_unsafe_block_sugg"]
|
||||
|
||||
extern crate external_unsafe_macro;
|
||||
|
||||
@ -9,11 +12,13 @@ unsafe fn unsf() {}
|
||||
|
||||
pub unsafe fn foo() {
|
||||
//~^ NOTE an unsafe function restricts its caller, but its body is safe by default
|
||||
unsf(); //~ ERROR call to unsafe function is unsafe
|
||||
//~^ NOTE
|
||||
unsf(); //[mir]~ ERROR call to unsafe function is unsafe
|
||||
//[thir]~^ ERROR call to unsafe function `unsf` is unsafe
|
||||
//~^^ NOTE
|
||||
//~| NOTE
|
||||
unsf(); //~ ERROR call to unsafe function is unsafe
|
||||
//~^ NOTE
|
||||
unsf(); //[mir]~ ERROR call to unsafe function is unsafe
|
||||
//[thir]~^ ERROR call to unsafe function `unsf` is unsafe
|
||||
//~^^ NOTE
|
||||
//~| NOTE
|
||||
}
|
||||
|
||||
@ -39,10 +44,12 @@ pub unsafe fn baz() -> i32 {
|
||||
}
|
||||
|
||||
macro_rules! unsafe_macro { () => (unsf()) }
|
||||
//~^ ERROR call to unsafe function is unsafe
|
||||
//[mir]~^ ERROR call to unsafe function is unsafe
|
||||
//[thir]~^^ ERROR call to unsafe function `unsf` is unsafe
|
||||
//~| NOTE
|
||||
//~| NOTE
|
||||
//~| ERROR call to unsafe function is unsafe
|
||||
//[mir]~| ERROR call to unsafe function is unsafe
|
||||
//[thir]~| ERROR call to unsafe function `unsf` is unsafe
|
||||
//~| NOTE
|
||||
//~| NOTE
|
||||
|
||||
|
73
tests/ui/unsafe/wrapping-unsafe-block-sugg.thir.fixed
Normal file
73
tests/ui/unsafe/wrapping-unsafe-block-sugg.thir.fixed
Normal file
@ -0,0 +1,73 @@
|
||||
// run-rustfix
|
||||
// aux-build:external_unsafe_macro.rs
|
||||
// revisions: mir thir
|
||||
// [thir]compile-flags: -Zthir-unsafeck
|
||||
|
||||
#![deny(unsafe_op_in_unsafe_fn)] //~ NOTE
|
||||
#![crate_name = "wrapping_unsafe_block_sugg"]
|
||||
|
||||
extern crate external_unsafe_macro;
|
||||
|
||||
unsafe fn unsf() {}
|
||||
|
||||
pub unsafe fn foo() { unsafe {
|
||||
//~^ NOTE an unsafe function restricts its caller, but its body is safe by default
|
||||
unsf(); //[mir]~ ERROR call to unsafe function is unsafe
|
||||
//[thir]~^ ERROR call to unsafe function `unsf` is unsafe
|
||||
//~^^ NOTE
|
||||
//~| NOTE
|
||||
unsf(); //[mir]~ ERROR call to unsafe function is unsafe
|
||||
//[thir]~^ ERROR call to unsafe function `unsf` is unsafe
|
||||
//~^^ NOTE
|
||||
//~| NOTE
|
||||
}}
|
||||
|
||||
pub unsafe fn bar(x: *const i32) -> i32 { unsafe {
|
||||
//~^ NOTE an unsafe function restricts its caller, but its body is safe by default
|
||||
let y = *x; //~ ERROR dereference of raw pointer is unsafe and requires unsafe block
|
||||
//~^ NOTE
|
||||
//~| NOTE
|
||||
y + *x //~ ERROR dereference of raw pointer is unsafe and requires unsafe block
|
||||
//~^ NOTE
|
||||
//~| NOTE
|
||||
}}
|
||||
|
||||
static mut BAZ: i32 = 0;
|
||||
pub unsafe fn baz() -> i32 { unsafe {
|
||||
//~^ NOTE an unsafe function restricts its caller, but its body is safe by default
|
||||
let y = BAZ; //~ ERROR use of mutable static is unsafe and requires unsafe block
|
||||
//~^ NOTE
|
||||
//~| NOTE
|
||||
y + BAZ //~ ERROR use of mutable static is unsafe and requires unsafe block
|
||||
//~^ NOTE
|
||||
//~| NOTE
|
||||
}}
|
||||
|
||||
macro_rules! unsafe_macro { () => (unsf()) }
|
||||
//[mir]~^ ERROR call to unsafe function is unsafe
|
||||
//[thir]~^^ ERROR call to unsafe function `unsf` is unsafe
|
||||
//~| NOTE
|
||||
//~| NOTE
|
||||
//[mir]~| ERROR call to unsafe function is unsafe
|
||||
//[thir]~| ERROR call to unsafe function `unsf` is unsafe
|
||||
//~| NOTE
|
||||
//~| NOTE
|
||||
|
||||
pub unsafe fn unsafe_in_macro() { unsafe {
|
||||
//~^ NOTE an unsafe function restricts its caller, but its body is safe by default
|
||||
unsafe_macro!();
|
||||
//~^ NOTE
|
||||
//~| NOTE
|
||||
unsafe_macro!();
|
||||
//~^ NOTE
|
||||
//~| NOTE
|
||||
}}
|
||||
|
||||
pub unsafe fn unsafe_in_external_macro() {
|
||||
// FIXME: https://github.com/rust-lang/rust/issues/112504
|
||||
// FIXME: ~^ NOTE an unsafe function restricts its caller, but its body is safe by default
|
||||
external_unsafe_macro::unsafe_macro!();
|
||||
external_unsafe_macro::unsafe_macro!();
|
||||
}
|
||||
|
||||
fn main() {}
|
99
tests/ui/unsafe/wrapping-unsafe-block-sugg.thir.stderr
Normal file
99
tests/ui/unsafe/wrapping-unsafe-block-sugg.thir.stderr
Normal file
@ -0,0 +1,99 @@
|
||||
error: call to unsafe function `unsf` is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:15:5
|
||||
|
|
||||
LL | unsf();
|
||||
| ^^^^^^ call to unsafe function
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:13:1
|
||||
|
|
||||
LL | pub unsafe fn foo() {
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
note: the lint level is defined here
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:6:9
|
||||
|
|
||||
LL | #![deny(unsafe_op_in_unsafe_fn)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: call to unsafe function `unsf` is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:19:5
|
||||
|
|
||||
LL | unsf();
|
||||
| ^^^^^^ call to unsafe function
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
|
||||
error: dereference of raw pointer is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:27:13
|
||||
|
|
||||
LL | let y = *x;
|
||||
| ^^ dereference of raw pointer
|
||||
|
|
||||
= note: raw pointers may be null, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:25:1
|
||||
|
|
||||
LL | pub unsafe fn bar(x: *const i32) -> i32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: dereference of raw pointer is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:30:9
|
||||
|
|
||||
LL | y + *x
|
||||
| ^^ dereference of raw pointer
|
||||
|
|
||||
= note: raw pointers may be null, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
|
||||
|
||||
error: use of mutable static is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:38:13
|
||||
|
|
||||
LL | let y = BAZ;
|
||||
| ^^^ use of mutable static
|
||||
|
|
||||
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:36:1
|
||||
|
|
||||
LL | pub unsafe fn baz() -> i32 {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: use of mutable static is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:41:9
|
||||
|
|
||||
LL | y + BAZ
|
||||
| ^^^ use of mutable static
|
||||
|
|
||||
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
|
||||
|
||||
error: call to unsafe function `unsf` is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:46:36
|
||||
|
|
||||
LL | macro_rules! unsafe_macro { () => (unsf()) }
|
||||
| ^^^^^^ call to unsafe function
|
||||
...
|
||||
LL | unsafe_macro!();
|
||||
| --------------- in this macro invocation
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
note: an unsafe function restricts its caller, but its body is safe by default
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:56:1
|
||||
|
|
||||
LL | pub unsafe fn unsafe_in_macro() {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: this error originates in the macro `unsafe_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: call to unsafe function `unsf` is unsafe and requires unsafe block (error E0133)
|
||||
--> $DIR/wrapping-unsafe-block-sugg.rs:46:36
|
||||
|
|
||||
LL | macro_rules! unsafe_macro { () => (unsf()) }
|
||||
| ^^^^^^ call to unsafe function
|
||||
...
|
||||
LL | unsafe_macro!();
|
||||
| --------------- in this macro invocation
|
||||
|
|
||||
= note: consult the function's documentation for information on how to avoid undefined behavior
|
||||
= note: this error originates in the macro `unsafe_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
Loading…
Reference in New Issue
Block a user