about summary refs log tree commit diff
diff options
context:
space:
mode:
author许杰友 Jieyou Xu (Joe) <39484203+jieyouxu@users.noreply.github.com>2024-11-30 12:56:54 +0800
committerGitHub <noreply@github.com>2024-11-30 12:56:54 +0800
commitc112195fec0084faf1ac375abd24ac5248dbf712 (patch)
tree48a50cb0f07311426abbbc047b22e56f838a0a4a
parent46f826cff79e5b874a6158e35a63287feb561588 (diff)
parentce98bf3d798bf183d33d2e3fc2d07a94e86e006e (diff)
downloadrust-c112195fec0084faf1ac375abd24ac5248dbf712.tar.gz
rust-c112195fec0084faf1ac375abd24ac5248dbf712.zip
Rollup merge of #133620 - dev-ardi:simplify-hir_typeck_pass_to_variadic_function, r=compiler-errors
Simplify hir_typeck_pass_to_variadic_function

r? ``@compiler-errors``
This reworks a bit how the diagnostic is generated so that it does the same as #133538

The `help` is useless now so I removed it
-rw-r--r--compiler/rustc_hir_typeck/messages.ftl1
-rw-r--r--compiler/rustc_hir_typeck/src/errors.rs7
-rw-r--r--compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs11
-rw-r--r--tests/ui/c-variadic/variadic-ffi-1.stderr42
-rw-r--r--tests/ui/error-codes/E0617.stderr35
5 files changed, 69 insertions, 27 deletions
diff --git a/compiler/rustc_hir_typeck/messages.ftl b/compiler/rustc_hir_typeck/messages.ftl
index 6001816ffbe..b27f7215ae4 100644
--- a/compiler/rustc_hir_typeck/messages.ftl
+++ b/compiler/rustc_hir_typeck/messages.ftl
@@ -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
     .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
 
 hir_typeck_ptr_cast_add_auto_to_object = adding {$traits_len ->
diff --git a/compiler/rustc_hir_typeck/src/errors.rs b/compiler/rustc_hir_typeck/src/errors.rs
index fa27abd270f..a2e00859307 100644
--- a/compiler/rustc_hir_typeck/src/errors.rs
+++ b/compiler/rustc_hir_typeck/src/errors.rs
@@ -789,11 +789,8 @@ pub(crate) struct PassToVariadicFunction<'a, 'tcx> {
     pub span: Span,
     pub ty: Ty<'tcx>,
     pub cast_ty: &'a str,
-    #[suggestion(code = "{replace}", applicability = "machine-applicable")]
-    pub sugg_span: Option<Span>,
-    pub replace: String,
-    #[help]
-    pub help: bool,
+    #[suggestion(code = " as {cast_ty}", applicability = "machine-applicable", style = "verbose")]
+    pub sugg_span: Span,
     #[note(hir_typeck_teach_help)]
     pub(crate) teach: bool,
 }
diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
index 63777f82f1a..30c838b74af 100644
--- a/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
+++ b/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
@@ -440,20 +440,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                     ty: Ty<'tcx>,
                     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 {
                         span,
                         ty,
                         cast_ty,
-                        help,
-                        replace,
-                        sugg_span,
+                        sugg_span: span.shrink_to_hi(),
                         teach: sess.teach(E0617),
                     });
                 }
diff --git a/tests/ui/c-variadic/variadic-ffi-1.stderr b/tests/ui/c-variadic/variadic-ffi-1.stderr
index ed5ff042a65..7a54d043356 100644
--- a/tests/ui/c-variadic/variadic-ffi-1.stderr
+++ b/tests/ui/c-variadic/variadic-ffi-1.stderr
@@ -62,37 +62,67 @@ error[E0617]: can't pass `f32` to variadic function
   --> $DIR/variadic-ffi-1.rs:28:19
    |
 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
   --> $DIR/variadic-ffi-1.rs:29:19
    |
 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
   --> $DIR/variadic-ffi-1.rs:30:19
    |
 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
   --> $DIR/variadic-ffi-1.rs:31:19
    |
 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
   --> $DIR/variadic-ffi-1.rs:32:19
    |
 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
   --> $DIR/variadic-ffi-1.rs:33:19
    |
 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
 
diff --git a/tests/ui/error-codes/E0617.stderr b/tests/ui/error-codes/E0617.stderr
index 7193463e028..b2eee129960 100644
--- a/tests/ui/error-codes/E0617.stderr
+++ b/tests/ui/error-codes/E0617.stderr
@@ -2,31 +2,56 @@ error[E0617]: can't pass `f32` to variadic function
   --> $DIR/E0617.rs:7:36
    |
 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
   --> $DIR/E0617.rs:10:36
    |
 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
   --> $DIR/E0617.rs:13:36
    |
 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
   --> $DIR/E0617.rs:16:36
    |
 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
   --> $DIR/E0617.rs:19:36
    |
 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
   --> $DIR/E0617.rs:22:36