simplify how the hir_typeck_pass_to_variadic_function
diagnostic is created
This commit is contained in:
parent
0c4f3a45b8
commit
ce98bf3d79
5 changed files with 69 additions and 27 deletions
|
@ -146,7 +146,6 @@ hir_typeck_option_result_copied = use `{$def_path}::copied` to copy the value in
|
||||||
|
|
||||||
hir_typeck_pass_to_variadic_function = can't pass `{$ty}` to variadic function
|
hir_typeck_pass_to_variadic_function = can't pass `{$ty}` to variadic function
|
||||||
.suggestion = cast the value to `{$cast_ty}`
|
.suggestion = cast the value to `{$cast_ty}`
|
||||||
.help = cast the value to `{$cast_ty}`
|
|
||||||
.teach_help = certain types, like `{$ty}`, must be casted before passing them to a variadic function, because of arcane ABI rules dictated by the C standard
|
.teach_help = certain types, like `{$ty}`, must be casted before passing them to a variadic function, because of arcane ABI rules dictated by the C standard
|
||||||
|
|
||||||
hir_typeck_ptr_cast_add_auto_to_object = adding {$traits_len ->
|
hir_typeck_ptr_cast_add_auto_to_object = adding {$traits_len ->
|
||||||
|
|
|
@ -789,11 +789,8 @@ pub(crate) struct PassToVariadicFunction<'a, 'tcx> {
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
pub ty: Ty<'tcx>,
|
pub ty: Ty<'tcx>,
|
||||||
pub cast_ty: &'a str,
|
pub cast_ty: &'a str,
|
||||||
#[suggestion(code = "{replace}", applicability = "machine-applicable")]
|
#[suggestion(code = " as {cast_ty}", applicability = "machine-applicable", style = "verbose")]
|
||||||
pub sugg_span: Option<Span>,
|
pub sugg_span: Span,
|
||||||
pub replace: String,
|
|
||||||
#[help]
|
|
||||||
pub help: bool,
|
|
||||||
#[note(hir_typeck_teach_help)]
|
#[note(hir_typeck_teach_help)]
|
||||||
pub(crate) teach: bool,
|
pub(crate) teach: bool,
|
||||||
}
|
}
|
||||||
|
|
|
@ -440,20 +440,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
cast_ty: &str,
|
cast_ty: &str,
|
||||||
) {
|
) {
|
||||||
let (sugg_span, replace, help) =
|
|
||||||
if let Ok(snippet) = sess.source_map().span_to_snippet(span) {
|
|
||||||
(Some(span), format!("{snippet} as {cast_ty}"), false)
|
|
||||||
} else {
|
|
||||||
(None, "".to_string(), true)
|
|
||||||
};
|
|
||||||
|
|
||||||
sess.dcx().emit_err(errors::PassToVariadicFunction {
|
sess.dcx().emit_err(errors::PassToVariadicFunction {
|
||||||
span,
|
span,
|
||||||
ty,
|
ty,
|
||||||
cast_ty,
|
cast_ty,
|
||||||
help,
|
sugg_span: span.shrink_to_hi(),
|
||||||
replace,
|
|
||||||
sugg_span,
|
|
||||||
teach: sess.teach(E0617),
|
teach: sess.teach(E0617),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,37 +62,67 @@ error[E0617]: can't pass `f32` to variadic function
|
||||||
--> $DIR/variadic-ffi-1.rs:28:19
|
--> $DIR/variadic-ffi-1.rs:28:19
|
||||||
|
|
|
|
||||||
LL | foo(1, 2, 3f32);
|
LL | foo(1, 2, 3f32);
|
||||||
| ^^^^ help: cast the value to `c_double`: `3f32 as c_double`
|
| ^^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_double`
|
||||||
|
|
|
||||||
|
LL | foo(1, 2, 3f32 as c_double);
|
||||||
|
| +++++++++++
|
||||||
|
|
||||||
error[E0617]: can't pass `bool` to variadic function
|
error[E0617]: can't pass `bool` to variadic function
|
||||||
--> $DIR/variadic-ffi-1.rs:29:19
|
--> $DIR/variadic-ffi-1.rs:29:19
|
||||||
|
|
|
|
||||||
LL | foo(1, 2, true);
|
LL | foo(1, 2, true);
|
||||||
| ^^^^ help: cast the value to `c_int`: `true as c_int`
|
| ^^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_int`
|
||||||
|
|
|
||||||
|
LL | foo(1, 2, true as c_int);
|
||||||
|
| ++++++++
|
||||||
|
|
||||||
error[E0617]: can't pass `i8` to variadic function
|
error[E0617]: can't pass `i8` to variadic function
|
||||||
--> $DIR/variadic-ffi-1.rs:30:19
|
--> $DIR/variadic-ffi-1.rs:30:19
|
||||||
|
|
|
|
||||||
LL | foo(1, 2, 1i8);
|
LL | foo(1, 2, 1i8);
|
||||||
| ^^^ help: cast the value to `c_int`: `1i8 as c_int`
|
| ^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_int`
|
||||||
|
|
|
||||||
|
LL | foo(1, 2, 1i8 as c_int);
|
||||||
|
| ++++++++
|
||||||
|
|
||||||
error[E0617]: can't pass `u8` to variadic function
|
error[E0617]: can't pass `u8` to variadic function
|
||||||
--> $DIR/variadic-ffi-1.rs:31:19
|
--> $DIR/variadic-ffi-1.rs:31:19
|
||||||
|
|
|
|
||||||
LL | foo(1, 2, 1u8);
|
LL | foo(1, 2, 1u8);
|
||||||
| ^^^ help: cast the value to `c_uint`: `1u8 as c_uint`
|
| ^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_uint`
|
||||||
|
|
|
||||||
|
LL | foo(1, 2, 1u8 as c_uint);
|
||||||
|
| +++++++++
|
||||||
|
|
||||||
error[E0617]: can't pass `i16` to variadic function
|
error[E0617]: can't pass `i16` to variadic function
|
||||||
--> $DIR/variadic-ffi-1.rs:32:19
|
--> $DIR/variadic-ffi-1.rs:32:19
|
||||||
|
|
|
|
||||||
LL | foo(1, 2, 1i16);
|
LL | foo(1, 2, 1i16);
|
||||||
| ^^^^ help: cast the value to `c_int`: `1i16 as c_int`
|
| ^^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_int`
|
||||||
|
|
|
||||||
|
LL | foo(1, 2, 1i16 as c_int);
|
||||||
|
| ++++++++
|
||||||
|
|
||||||
error[E0617]: can't pass `u16` to variadic function
|
error[E0617]: can't pass `u16` to variadic function
|
||||||
--> $DIR/variadic-ffi-1.rs:33:19
|
--> $DIR/variadic-ffi-1.rs:33:19
|
||||||
|
|
|
|
||||||
LL | foo(1, 2, 1u16);
|
LL | foo(1, 2, 1u16);
|
||||||
| ^^^^ help: cast the value to `c_uint`: `1u16 as c_uint`
|
| ^^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_uint`
|
||||||
|
|
|
||||||
|
LL | foo(1, 2, 1u16 as c_uint);
|
||||||
|
| +++++++++
|
||||||
|
|
||||||
error: aborting due to 11 previous errors
|
error: aborting due to 11 previous errors
|
||||||
|
|
||||||
|
|
|
@ -2,31 +2,56 @@ error[E0617]: can't pass `f32` to variadic function
|
||||||
--> $DIR/E0617.rs:7:36
|
--> $DIR/E0617.rs:7:36
|
||||||
|
|
|
|
||||||
LL | printf(::std::ptr::null(), 0f32);
|
LL | printf(::std::ptr::null(), 0f32);
|
||||||
| ^^^^ help: cast the value to `c_double`: `0f32 as c_double`
|
| ^^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_double`
|
||||||
|
|
|
||||||
|
LL | printf(::std::ptr::null(), 0f32 as c_double);
|
||||||
|
| +++++++++++
|
||||||
|
|
||||||
error[E0617]: can't pass `i8` to variadic function
|
error[E0617]: can't pass `i8` to variadic function
|
||||||
--> $DIR/E0617.rs:10:36
|
--> $DIR/E0617.rs:10:36
|
||||||
|
|
|
|
||||||
LL | printf(::std::ptr::null(), 0i8);
|
LL | printf(::std::ptr::null(), 0i8);
|
||||||
| ^^^ help: cast the value to `c_int`: `0i8 as c_int`
|
| ^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_int`
|
||||||
|
|
|
||||||
|
LL | printf(::std::ptr::null(), 0i8 as c_int);
|
||||||
|
| ++++++++
|
||||||
|
|
||||||
error[E0617]: can't pass `i16` to variadic function
|
error[E0617]: can't pass `i16` to variadic function
|
||||||
--> $DIR/E0617.rs:13:36
|
--> $DIR/E0617.rs:13:36
|
||||||
|
|
|
|
||||||
LL | printf(::std::ptr::null(), 0i16);
|
LL | printf(::std::ptr::null(), 0i16);
|
||||||
| ^^^^ help: cast the value to `c_int`: `0i16 as c_int`
|
| ^^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_int`
|
||||||
|
|
|
||||||
|
LL | printf(::std::ptr::null(), 0i16 as c_int);
|
||||||
|
| ++++++++
|
||||||
|
|
||||||
error[E0617]: can't pass `u8` to variadic function
|
error[E0617]: can't pass `u8` to variadic function
|
||||||
--> $DIR/E0617.rs:16:36
|
--> $DIR/E0617.rs:16:36
|
||||||
|
|
|
|
||||||
LL | printf(::std::ptr::null(), 0u8);
|
LL | printf(::std::ptr::null(), 0u8);
|
||||||
| ^^^ help: cast the value to `c_uint`: `0u8 as c_uint`
|
| ^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_uint`
|
||||||
|
|
|
||||||
|
LL | printf(::std::ptr::null(), 0u8 as c_uint);
|
||||||
|
| +++++++++
|
||||||
|
|
||||||
error[E0617]: can't pass `u16` to variadic function
|
error[E0617]: can't pass `u16` to variadic function
|
||||||
--> $DIR/E0617.rs:19:36
|
--> $DIR/E0617.rs:19:36
|
||||||
|
|
|
|
||||||
LL | printf(::std::ptr::null(), 0u16);
|
LL | printf(::std::ptr::null(), 0u16);
|
||||||
| ^^^^ help: cast the value to `c_uint`: `0u16 as c_uint`
|
| ^^^^
|
||||||
|
|
|
||||||
|
help: cast the value to `c_uint`
|
||||||
|
|
|
||||||
|
LL | printf(::std::ptr::null(), 0u16 as c_uint);
|
||||||
|
| +++++++++
|
||||||
|
|
||||||
error[E0617]: can't pass a function item to a variadic function
|
error[E0617]: can't pass a function item to a variadic function
|
||||||
--> $DIR/E0617.rs:22:36
|
--> $DIR/E0617.rs:22:36
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue