From 701b1948abd46425ab588108bb406b7519ec16fa Mon Sep 17 00:00:00 2001 From: tiif Date: Tue, 21 Jan 2025 08:08:58 +0000 Subject: [PATCH 01/10] impl Display for Conv --- .../rustc_const_eval/src/interpret/call.rs | 4 +-- compiler/rustc_target/src/callconv/mod.rs | 32 +++++++++++++++++++ src/tools/miri/src/helpers.rs | 3 +- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_const_eval/src/interpret/call.rs b/compiler/rustc_const_eval/src/interpret/call.rs index 29f819cca1fb6..35e2518770179 100644 --- a/compiler/rustc_const_eval/src/interpret/call.rs +++ b/compiler/rustc_const_eval/src/interpret/call.rs @@ -353,8 +353,8 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> { if caller_fn_abi.conv != callee_fn_abi.conv { throw_ub_custom!( fluent::const_eval_incompatible_calling_conventions, - callee_conv = format!("{:?}", callee_fn_abi.conv), - caller_conv = format!("{:?}", caller_fn_abi.conv), + callee_conv = format!("{}", callee_fn_abi.conv), + caller_conv = format!("{}", caller_fn_abi.conv), ) } diff --git a/compiler/rustc_target/src/callconv/mod.rs b/compiler/rustc_target/src/callconv/mod.rs index 6d0ee3c7ee58a..0ea0d2d0173a8 100644 --- a/compiler/rustc_target/src/callconv/mod.rs +++ b/compiler/rustc_target/src/callconv/mod.rs @@ -1,3 +1,4 @@ +use std::fmt::Display; use std::str::FromStr; use std::{fmt, iter}; @@ -897,6 +898,37 @@ impl FromStr for Conv { } } +impl Display for Conv { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str(match self { + Conv::C => "C", + Conv::Rust => "Rust", + Conv::Cold => "Cold", + Conv::PreserveMost => "PreserveMost", + Conv::PreserveAll => "PreserveAll", + Conv::ArmAapcs => "ArmAapcs", + Conv::CCmseNonSecureCall => "CCmseNonSecureCall", + Conv::CCmseNonSecureEntry => "CCmseNonSecureEntry", + Conv::Msp430Intr => "Msp430Intr", + Conv::PtxKernel => "PtxKernel", + Conv::GpuKernel => "GpuKernel", + Conv::X86Fastcall => "X86Fastcall", + Conv::X86Intr => "X86Intr", + Conv::X86Stdcall => "X86Stdcall", + Conv::X86ThisCall => "X86ThisCall", + Conv::X86VectorCall => "X86VectorCall", + Conv::X86_64SysV => "X86_64SysV", + Conv::X86_64Win64 => "X86_64Win64", + Conv::AvrInterrupt => "AvrInterrupt", + Conv::AvrNonBlockingInterrupt => "AvrNonBlockingInterrupt", + Conv::RiscvInterrupt { kind: RiscvInterruptKind::Machine } => "RiscvInterrupt(machine)", + Conv::RiscvInterrupt { kind: RiscvInterruptKind::Supervisor } => { + "RiscvInterrupt(supervisor)" + } + }) + } +} + // Some types are used a lot. Make sure they don't unintentionally get bigger. #[cfg(target_pointer_width = "64")] mod size_asserts { diff --git a/src/tools/miri/src/helpers.rs b/src/tools/miri/src/helpers.rs index 12e7d0f1a62cf..bf08f9639c0cb 100644 --- a/src/tools/miri/src/helpers.rs +++ b/src/tools/miri/src/helpers.rs @@ -932,8 +932,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> { fn check_abi<'a>(&self, fn_abi: &FnAbi<'tcx, Ty<'tcx>>, exp_abi: Conv) -> InterpResult<'a, ()> { if fn_abi.conv != exp_abi { throw_ub_format!( - "calling a function with ABI {:?} using caller ABI {:?}", - exp_abi, + "calling a function with ABI {exp_abi} using caller ABI {}", fn_abi.conv ); } From 17c6eae2910ffcb0e2a285625984f2eded45a285 Mon Sep 17 00:00:00 2001 From: tiif Date: Mon, 3 Feb 2025 13:50:39 +0000 Subject: [PATCH 02/10] Add test and change ub message wording --- src/tools/miri/src/helpers.rs | 8 ++++---- .../miri/tests/fail/shims/callconv_mismatch.rs | 11 +++++++++++ .../tests/fail/shims/callconv_mismatch.stderr | 15 +++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 src/tools/miri/tests/fail/shims/callconv_mismatch.rs create mode 100644 src/tools/miri/tests/fail/shims/callconv_mismatch.stderr diff --git a/src/tools/miri/src/helpers.rs b/src/tools/miri/src/helpers.rs index bf08f9639c0cb..04829a9424c13 100644 --- a/src/tools/miri/src/helpers.rs +++ b/src/tools/miri/src/helpers.rs @@ -928,11 +928,11 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> { self.read_c_str_with_char_size(ptr, wchar_t.size, wchar_t.align.abi) } - /// Check that the ABI is what we expect. - fn check_abi<'a>(&self, fn_abi: &FnAbi<'tcx, Ty<'tcx>>, exp_abi: Conv) -> InterpResult<'a, ()> { + /// Check that the calling convention is what we expect. + fn check_callconv<'a>(&self, fn_abi: &FnAbi<'tcx, Ty<'tcx>>, exp_abi: Conv) -> InterpResult<'a, ()> { if fn_abi.conv != exp_abi { throw_ub_format!( - "calling a function with ABI {exp_abi} using caller ABI {}", + "calling a function with calling convention {exp_abi} using caller calling convention {}", fn_abi.conv ); } @@ -968,7 +968,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> { exp_abi: Conv, link_name: Symbol, ) -> InterpResult<'tcx, ()> { - self.check_abi(abi, exp_abi)?; + self.check_callconv(abi, exp_abi)?; if let Some((body, instance)) = self.eval_context_mut().lookup_exported_symbol(link_name)? { // If compiler-builtins is providing the symbol, then don't treat it as a clash. // We'll use our built-in implementation in `emulate_foreign_item_inner` for increased diff --git a/src/tools/miri/tests/fail/shims/callconv_mismatch.rs b/src/tools/miri/tests/fail/shims/callconv_mismatch.rs new file mode 100644 index 0000000000000..2f9b89ae08d2b --- /dev/null +++ b/src/tools/miri/tests/fail/shims/callconv_mismatch.rs @@ -0,0 +1,11 @@ +extern "Rust" { + fn pipe(fds: *mut std::ffi::c_int) -> std::ffi::c_int; +} + +// Test the error for calling convention mismatch. +fn main() { + let mut fds = [-1, -1]; + let res = unsafe { pipe(fds.as_mut_ptr()) }; + //~^ ERROR: calling a function with calling convention C using caller calling convention Rust + assert_eq!(res, 0); +} \ No newline at end of file diff --git a/src/tools/miri/tests/fail/shims/callconv_mismatch.stderr b/src/tools/miri/tests/fail/shims/callconv_mismatch.stderr new file mode 100644 index 0000000000000..11b57de195391 --- /dev/null +++ b/src/tools/miri/tests/fail/shims/callconv_mismatch.stderr @@ -0,0 +1,15 @@ +error: Undefined Behavior: calling a function with calling convention C using caller calling convention Rust + --> tests/fail/shims/callconv_mismatch.rs:LL:CC + | +LL | let res = unsafe { pipe(fds.as_mut_ptr()) }; + | ^^^^^^^^^^^^^^^^^^^^^^ calling a function with calling convention C using caller calling convention Rust + | + = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior + = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information + = note: BACKTRACE: + = note: inside `main` at tests/fail/shims/callconv_mismatch.rs:LL:CC + +note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace + +error: aborting due to 1 previous error + From 43c51e9ff33e0014c0e17712d01ae8dc44a57096 Mon Sep 17 00:00:00 2001 From: tiif Date: Mon, 3 Feb 2025 13:51:44 +0000 Subject: [PATCH 03/10] Remove unnecessary assert --- src/tools/miri/tests/fail/shims/callconv_mismatch.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tools/miri/tests/fail/shims/callconv_mismatch.rs b/src/tools/miri/tests/fail/shims/callconv_mismatch.rs index 2f9b89ae08d2b..adde34dc1fae4 100644 --- a/src/tools/miri/tests/fail/shims/callconv_mismatch.rs +++ b/src/tools/miri/tests/fail/shims/callconv_mismatch.rs @@ -7,5 +7,4 @@ fn main() { let mut fds = [-1, -1]; let res = unsafe { pipe(fds.as_mut_ptr()) }; //~^ ERROR: calling a function with calling convention C using caller calling convention Rust - assert_eq!(res, 0); } \ No newline at end of file From d463c5d07c4715f4ebd86b2093139784fa69bd2b Mon Sep 17 00:00:00 2001 From: tiif Date: Tue, 11 Mar 2025 16:46:26 +0000 Subject: [PATCH 04/10] Implement Display by mapping Conv to ExternAbi --- compiler/rustc_target/src/callconv/mod.rs | 53 ++++++++++--------- .../fail/function_calls/check_arg_abi.rs | 2 +- .../fail/function_calls/check_arg_abi.stderr | 4 +- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/compiler/rustc_target/src/callconv/mod.rs b/compiler/rustc_target/src/callconv/mod.rs index 0ea0d2d0173a8..8d8270cd8cd9f 100644 --- a/compiler/rustc_target/src/callconv/mod.rs +++ b/compiler/rustc_target/src/callconv/mod.rs @@ -898,34 +898,35 @@ impl FromStr for Conv { } } +fn conv_to_externabi(conv: &Conv) -> ExternAbi { + match conv { + Conv::Rust => ExternAbi::Rust, + Conv::PreserveMost => ExternAbi::RustCold, + Conv::X86Stdcall => ExternAbi::Stdcall{unwind: false}, + Conv::X86Fastcall => ExternAbi::Fastcall{unwind: false}, + Conv::X86VectorCall => ExternAbi::Vectorcall{unwind: false}, + Conv::X86ThisCall => ExternAbi::Thiscall{unwind: false}, + Conv::C => ExternAbi::C{unwind: false}, + Conv::X86_64Win64 => ExternAbi::Win64{unwind: false}, + Conv::X86_64SysV => ExternAbi::SysV64{unwind: false}, + Conv::ArmAapcs => ExternAbi::Aapcs{unwind: false}, + Conv::CCmseNonSecureCall => ExternAbi::CCmseNonSecureCall, + Conv::CCmseNonSecureEntry => ExternAbi::CCmseNonSecureEntry, + Conv::PtxKernel => ExternAbi::PtxKernel, + Conv::Msp430Intr => ExternAbi::Msp430Interrupt, + Conv::X86Intr => ExternAbi::X86Interrupt, + Conv::GpuKernel => ExternAbi::GpuKernel, + Conv::AvrInterrupt => ExternAbi::AvrInterrupt, + Conv::AvrNonBlockingInterrupt => ExternAbi::AvrNonBlockingInterrupt, + Conv::RiscvInterrupt { kind: RiscvInterruptKind::Machine } => ExternAbi::RiscvInterruptM, + Conv::RiscvInterrupt { kind: RiscvInterruptKind::Supervisor } => ExternAbi::RiscvInterruptS, + Conv::Cold | Conv::PreserveAll => panic!("This is deadcode"), + } +} + impl Display for Conv { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str(match self { - Conv::C => "C", - Conv::Rust => "Rust", - Conv::Cold => "Cold", - Conv::PreserveMost => "PreserveMost", - Conv::PreserveAll => "PreserveAll", - Conv::ArmAapcs => "ArmAapcs", - Conv::CCmseNonSecureCall => "CCmseNonSecureCall", - Conv::CCmseNonSecureEntry => "CCmseNonSecureEntry", - Conv::Msp430Intr => "Msp430Intr", - Conv::PtxKernel => "PtxKernel", - Conv::GpuKernel => "GpuKernel", - Conv::X86Fastcall => "X86Fastcall", - Conv::X86Intr => "X86Intr", - Conv::X86Stdcall => "X86Stdcall", - Conv::X86ThisCall => "X86ThisCall", - Conv::X86VectorCall => "X86VectorCall", - Conv::X86_64SysV => "X86_64SysV", - Conv::X86_64Win64 => "X86_64Win64", - Conv::AvrInterrupt => "AvrInterrupt", - Conv::AvrNonBlockingInterrupt => "AvrNonBlockingInterrupt", - Conv::RiscvInterrupt { kind: RiscvInterruptKind::Machine } => "RiscvInterrupt(machine)", - Conv::RiscvInterrupt { kind: RiscvInterruptKind::Supervisor } => { - "RiscvInterrupt(supervisor)" - } - }) + write!(f, "{}", conv_to_externabi(self)) } } diff --git a/src/tools/miri/tests/fail/function_calls/check_arg_abi.rs b/src/tools/miri/tests/fail/function_calls/check_arg_abi.rs index ffa0443ce507a..0e91636416903 100644 --- a/src/tools/miri/tests/fail/function_calls/check_arg_abi.rs +++ b/src/tools/miri/tests/fail/function_calls/check_arg_abi.rs @@ -4,6 +4,6 @@ fn main() { } unsafe { - let _ = malloc(0); //~ ERROR: calling a function with ABI C using caller ABI Rust + let _ = malloc(0); //~ ERROR: calling a function with calling convention "C" using caller calling convention "Rust" }; } diff --git a/src/tools/miri/tests/fail/function_calls/check_arg_abi.stderr b/src/tools/miri/tests/fail/function_calls/check_arg_abi.stderr index bf1fbb7721f1f..7873018292316 100644 --- a/src/tools/miri/tests/fail/function_calls/check_arg_abi.stderr +++ b/src/tools/miri/tests/fail/function_calls/check_arg_abi.stderr @@ -1,8 +1,8 @@ -error: Undefined Behavior: calling a function with ABI C using caller ABI Rust +error: Undefined Behavior: calling a function with calling convention "C" using caller calling convention "Rust" --> tests/fail/function_calls/check_arg_abi.rs:LL:CC | LL | let _ = malloc(0); - | ^^^^^^^^^ calling a function with ABI C using caller ABI Rust + | ^^^^^^^^^ calling a function with calling convention "C" using caller calling convention "Rust" | = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information From 3079213020e518c29046b01b483ea37e949eb27d Mon Sep 17 00:00:00 2001 From: tiif Date: Tue, 11 Mar 2025 16:47:40 +0000 Subject: [PATCH 05/10] Remove test --- .../miri/tests/fail/shims/callconv_mismatch.rs | 10 ---------- .../tests/fail/shims/callconv_mismatch.stderr | 15 --------------- 2 files changed, 25 deletions(-) delete mode 100644 src/tools/miri/tests/fail/shims/callconv_mismatch.rs delete mode 100644 src/tools/miri/tests/fail/shims/callconv_mismatch.stderr diff --git a/src/tools/miri/tests/fail/shims/callconv_mismatch.rs b/src/tools/miri/tests/fail/shims/callconv_mismatch.rs deleted file mode 100644 index adde34dc1fae4..0000000000000 --- a/src/tools/miri/tests/fail/shims/callconv_mismatch.rs +++ /dev/null @@ -1,10 +0,0 @@ -extern "Rust" { - fn pipe(fds: *mut std::ffi::c_int) -> std::ffi::c_int; -} - -// Test the error for calling convention mismatch. -fn main() { - let mut fds = [-1, -1]; - let res = unsafe { pipe(fds.as_mut_ptr()) }; - //~^ ERROR: calling a function with calling convention C using caller calling convention Rust -} \ No newline at end of file diff --git a/src/tools/miri/tests/fail/shims/callconv_mismatch.stderr b/src/tools/miri/tests/fail/shims/callconv_mismatch.stderr deleted file mode 100644 index 11b57de195391..0000000000000 --- a/src/tools/miri/tests/fail/shims/callconv_mismatch.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error: Undefined Behavior: calling a function with calling convention C using caller calling convention Rust - --> tests/fail/shims/callconv_mismatch.rs:LL:CC - | -LL | let res = unsafe { pipe(fds.as_mut_ptr()) }; - | ^^^^^^^^^^^^^^^^^^^^^^ calling a function with calling convention C using caller calling convention Rust - | - = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior - = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information - = note: BACKTRACE: - = note: inside `main` at tests/fail/shims/callconv_mismatch.rs:LL:CC - -note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace - -error: aborting due to 1 previous error - From c8197b77c9dcda42df92944d10e45382b490e504 Mon Sep 17 00:00:00 2001 From: tiif Date: Tue, 11 Mar 2025 16:48:20 +0000 Subject: [PATCH 06/10] fmt --- compiler/rustc_target/src/callconv/mod.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_target/src/callconv/mod.rs b/compiler/rustc_target/src/callconv/mod.rs index 8d8270cd8cd9f..e019dc55950e8 100644 --- a/compiler/rustc_target/src/callconv/mod.rs +++ b/compiler/rustc_target/src/callconv/mod.rs @@ -902,14 +902,14 @@ fn conv_to_externabi(conv: &Conv) -> ExternAbi { match conv { Conv::Rust => ExternAbi::Rust, Conv::PreserveMost => ExternAbi::RustCold, - Conv::X86Stdcall => ExternAbi::Stdcall{unwind: false}, - Conv::X86Fastcall => ExternAbi::Fastcall{unwind: false}, - Conv::X86VectorCall => ExternAbi::Vectorcall{unwind: false}, - Conv::X86ThisCall => ExternAbi::Thiscall{unwind: false}, - Conv::C => ExternAbi::C{unwind: false}, - Conv::X86_64Win64 => ExternAbi::Win64{unwind: false}, - Conv::X86_64SysV => ExternAbi::SysV64{unwind: false}, - Conv::ArmAapcs => ExternAbi::Aapcs{unwind: false}, + Conv::X86Stdcall => ExternAbi::Stdcall { unwind: false }, + Conv::X86Fastcall => ExternAbi::Fastcall { unwind: false }, + Conv::X86VectorCall => ExternAbi::Vectorcall { unwind: false }, + Conv::X86ThisCall => ExternAbi::Thiscall { unwind: false }, + Conv::C => ExternAbi::C { unwind: false }, + Conv::X86_64Win64 => ExternAbi::Win64 { unwind: false }, + Conv::X86_64SysV => ExternAbi::SysV64 { unwind: false }, + Conv::ArmAapcs => ExternAbi::Aapcs { unwind: false }, Conv::CCmseNonSecureCall => ExternAbi::CCmseNonSecureCall, Conv::CCmseNonSecureEntry => ExternAbi::CCmseNonSecureEntry, Conv::PtxKernel => ExternAbi::PtxKernel, From 71c4b2492de8a34a81f362ef9769b1608b8310e4 Mon Sep 17 00:00:00 2001 From: tiif Date: Tue, 11 Mar 2025 17:23:12 +0000 Subject: [PATCH 07/10] Remove invalid Conv --- compiler/rustc_target/src/callconv/mod.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/compiler/rustc_target/src/callconv/mod.rs b/compiler/rustc_target/src/callconv/mod.rs index e019dc55950e8..6aae8bc755602 100644 --- a/compiler/rustc_target/src/callconv/mod.rs +++ b/compiler/rustc_target/src/callconv/mod.rs @@ -900,22 +900,21 @@ impl FromStr for Conv { fn conv_to_externabi(conv: &Conv) -> ExternAbi { match conv { + Conv::C => ExternAbi::C { unwind: false }, Conv::Rust => ExternAbi::Rust, Conv::PreserveMost => ExternAbi::RustCold, - Conv::X86Stdcall => ExternAbi::Stdcall { unwind: false }, - Conv::X86Fastcall => ExternAbi::Fastcall { unwind: false }, - Conv::X86VectorCall => ExternAbi::Vectorcall { unwind: false }, - Conv::X86ThisCall => ExternAbi::Thiscall { unwind: false }, - Conv::C => ExternAbi::C { unwind: false }, - Conv::X86_64Win64 => ExternAbi::Win64 { unwind: false }, - Conv::X86_64SysV => ExternAbi::SysV64 { unwind: false }, Conv::ArmAapcs => ExternAbi::Aapcs { unwind: false }, Conv::CCmseNonSecureCall => ExternAbi::CCmseNonSecureCall, Conv::CCmseNonSecureEntry => ExternAbi::CCmseNonSecureEntry, - Conv::PtxKernel => ExternAbi::PtxKernel, Conv::Msp430Intr => ExternAbi::Msp430Interrupt, - Conv::X86Intr => ExternAbi::X86Interrupt, Conv::GpuKernel => ExternAbi::GpuKernel, + Conv::X86Fastcall => ExternAbi::Fastcall { unwind: false }, + Conv::X86Intr => ExternAbi::X86Interrupt, + Conv::X86Stdcall => ExternAbi::Stdcall { unwind: false }, + Conv::X86ThisCall => ExternAbi::Thiscall { unwind: false }, + Conv::X86VectorCall => ExternAbi::Vectorcall { unwind: false }, + Conv::X86_64SysV => ExternAbi::SysV64 { unwind: false }, + Conv::X86_64Win64 => ExternAbi::Win64 { unwind: false }, Conv::AvrInterrupt => ExternAbi::AvrInterrupt, Conv::AvrNonBlockingInterrupt => ExternAbi::AvrNonBlockingInterrupt, Conv::RiscvInterrupt { kind: RiscvInterruptKind::Machine } => ExternAbi::RiscvInterruptM, From 650c8a2fb592a7519c37549734b664301b4b13be Mon Sep 17 00:00:00 2001 From: tiif Date: Wed, 12 Mar 2025 16:59:25 +0000 Subject: [PATCH 08/10] bless test --- .../miri/tests/fail/function_calls/check_callback_abi.rs | 2 +- .../tests/fail/function_calls/check_callback_abi.stderr | 4 ++-- .../exported_symbol_abi_mismatch.cache.stderr | 4 ++-- .../exported_symbol_abi_mismatch.fn_ptr.stderr | 4 ++-- .../exported_symbol_abi_mismatch.no_cache.stderr | 4 ++-- .../fail/function_calls/exported_symbol_abi_mismatch.rs | 6 +++--- src/tools/miri/tests/fail/tail_calls/cc-mismatch.rs | 2 +- src/tools/miri/tests/fail/tail_calls/cc-mismatch.stderr | 4 ++-- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/tools/miri/tests/fail/function_calls/check_callback_abi.rs b/src/tools/miri/tests/fail/function_calls/check_callback_abi.rs index 6a7a26710d16b..177e38105e6fa 100644 --- a/src/tools/miri/tests/fail/function_calls/check_callback_abi.rs +++ b/src/tools/miri/tests/fail/function_calls/check_callback_abi.rs @@ -9,7 +9,7 @@ fn main() { // Make sure we check the ABI when Miri itself invokes a function // as part of a shim implementation. std::intrinsics::catch_unwind( - //~^ ERROR: calling a function with calling convention C using calling convention Rust + //~^ ERROR: calling a function with calling convention "C" using calling convention "Rust" std::mem::transmute::(try_fn), std::ptr::null_mut(), |_, _| unreachable!(), diff --git a/src/tools/miri/tests/fail/function_calls/check_callback_abi.stderr b/src/tools/miri/tests/fail/function_calls/check_callback_abi.stderr index 6b0692e1c6e8d..20182ac923677 100644 --- a/src/tools/miri/tests/fail/function_calls/check_callback_abi.stderr +++ b/src/tools/miri/tests/fail/function_calls/check_callback_abi.stderr @@ -1,4 +1,4 @@ -error: Undefined Behavior: calling a function with calling convention C using calling convention Rust +error: Undefined Behavior: calling a function with calling convention "C" using calling convention "Rust" --> tests/fail/function_calls/check_callback_abi.rs:LL:CC | LL | / std::intrinsics::catch_unwind( @@ -7,7 +7,7 @@ LL | | std::mem::transmute::(try_fn), LL | | std::ptr::null_mut(), LL | | |_, _| unreachable!(), LL | | ); - | |_________^ calling a function with calling convention C using calling convention Rust + | |_________^ calling a function with calling convention "C" using calling convention "Rust" | = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information diff --git a/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.cache.stderr b/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.cache.stderr index e4302ad1d3a53..46a32d1487ead 100644 --- a/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.cache.stderr +++ b/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.cache.stderr @@ -1,8 +1,8 @@ -error: Undefined Behavior: calling a function with calling convention Rust using calling convention C +error: Undefined Behavior: calling a function with calling convention "Rust" using calling convention "C" --> tests/fail/function_calls/exported_symbol_abi_mismatch.rs:LL:CC | LL | foo(); - | ^^^^^ calling a function with calling convention Rust using calling convention C + | ^^^^^ calling a function with calling convention "Rust" using calling convention "C" | = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information diff --git a/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.fn_ptr.stderr b/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.fn_ptr.stderr index 9f40c48b338e3..3872528991905 100644 --- a/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.fn_ptr.stderr +++ b/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.fn_ptr.stderr @@ -1,8 +1,8 @@ -error: Undefined Behavior: calling a function with calling convention Rust using calling convention C +error: Undefined Behavior: calling a function with calling convention "Rust" using calling convention "C" --> tests/fail/function_calls/exported_symbol_abi_mismatch.rs:LL:CC | LL | std::mem::transmute::(foo)(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ calling a function with calling convention Rust using calling convention C + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ calling a function with calling convention "Rust" using calling convention "C" | = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information diff --git a/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.no_cache.stderr b/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.no_cache.stderr index e4302ad1d3a53..46a32d1487ead 100644 --- a/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.no_cache.stderr +++ b/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.no_cache.stderr @@ -1,8 +1,8 @@ -error: Undefined Behavior: calling a function with calling convention Rust using calling convention C +error: Undefined Behavior: calling a function with calling convention "Rust" using calling convention "C" --> tests/fail/function_calls/exported_symbol_abi_mismatch.rs:LL:CC | LL | foo(); - | ^^^^^ calling a function with calling convention Rust using calling convention C + | ^^^^^ calling a function with calling convention "Rust" using calling convention "C" | = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information diff --git a/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.rs b/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.rs index 50a0e8e6edef8..1950e162c0700 100644 --- a/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.rs +++ b/src/tools/miri/tests/fail/function_calls/exported_symbol_abi_mismatch.rs @@ -12,7 +12,7 @@ fn main() { #[cfg(fn_ptr)] unsafe { std::mem::transmute::(foo)(); - //~[fn_ptr]^ ERROR: calling a function with calling convention Rust using calling convention C + //~[fn_ptr]^ ERROR: calling a function with calling convention "Rust" using calling convention "C" } // `Instance` caching should not suppress ABI check. @@ -28,8 +28,8 @@ fn main() { } unsafe { foo(); - //~[no_cache]^ ERROR: calling a function with calling convention Rust using calling convention C - //~[cache]| ERROR: calling a function with calling convention Rust using calling convention C + //~[no_cache]^ ERROR: calling a function with calling convention "Rust" using calling convention "C" + //~[cache]| ERROR: calling a function with calling convention "Rust" using calling convention "C" } } } diff --git a/src/tools/miri/tests/fail/tail_calls/cc-mismatch.rs b/src/tools/miri/tests/fail/tail_calls/cc-mismatch.rs index 5f00dbf257366..952f9697fc795 100644 --- a/src/tools/miri/tests/fail/tail_calls/cc-mismatch.rs +++ b/src/tools/miri/tests/fail/tail_calls/cc-mismatch.rs @@ -1,4 +1,4 @@ -//@error-in-other-file: Undefined Behavior: calling a function with calling convention C using calling convention Rust +//@error-in-other-file: Undefined Behavior: calling a function with calling convention "C" using calling convention "Rust" #![feature(explicit_tail_calls)] #![allow(incomplete_features)] diff --git a/src/tools/miri/tests/fail/tail_calls/cc-mismatch.stderr b/src/tools/miri/tests/fail/tail_calls/cc-mismatch.stderr index 5061c9e8dc3f0..61ddea644720f 100644 --- a/src/tools/miri/tests/fail/tail_calls/cc-mismatch.stderr +++ b/src/tools/miri/tests/fail/tail_calls/cc-mismatch.stderr @@ -1,8 +1,8 @@ -error: Undefined Behavior: calling a function with calling convention C using calling convention Rust +error: Undefined Behavior: calling a function with calling convention "C" using calling convention "Rust" --> RUSTLIB/core/src/ops/function.rs:LL:CC | LL | extern "rust-call" fn call_once(self, args: Args) -> Self::Output; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ calling a function with calling convention C using calling convention Rust + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ calling a function with calling convention "C" using calling convention "Rust" | = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information From e74fe7a6ad02391ff873916a4e0243144e5e9355 Mon Sep 17 00:00:00 2001 From: tiif Date: Wed, 12 Mar 2025 17:13:47 +0000 Subject: [PATCH 09/10] Bless more test --- tests/ui/consts/miri_unleashed/abi-mismatch.rs | 2 +- tests/ui/consts/miri_unleashed/abi-mismatch.stderr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ui/consts/miri_unleashed/abi-mismatch.rs b/tests/ui/consts/miri_unleashed/abi-mismatch.rs index ea640ae78d551..727cfecfa4165 100644 --- a/tests/ui/consts/miri_unleashed/abi-mismatch.rs +++ b/tests/ui/consts/miri_unleashed/abi-mismatch.rs @@ -10,6 +10,6 @@ const fn call_rust_fn(my_fn: extern "Rust" fn()) { static VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn()) }); //~^ ERROR could not evaluate static initializer -//~| NOTE calling a function with calling convention C using calling convention Rust +//~| NOTE calling a function with calling convention "C" using calling convention "Rust" fn main() {} diff --git a/tests/ui/consts/miri_unleashed/abi-mismatch.stderr b/tests/ui/consts/miri_unleashed/abi-mismatch.stderr index 88623b134b0bf..7d1fdcce52614 100644 --- a/tests/ui/consts/miri_unleashed/abi-mismatch.stderr +++ b/tests/ui/consts/miri_unleashed/abi-mismatch.stderr @@ -2,7 +2,7 @@ error[E0080]: could not evaluate static initializer --> $DIR/abi-mismatch.rs:11:18 | LL | static VAL: () = call_rust_fn(unsafe { std::mem::transmute(c_fn as extern "C" fn()) }); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ calling a function with calling convention C using calling convention Rust + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ calling a function with calling convention "C" using calling convention "Rust" | note: inside `call_rust_fn` --> $DIR/abi-mismatch.rs:7:5 From 41a2260bc7d7388a6ef2b0dfa7a980c977e26081 Mon Sep 17 00:00:00 2001 From: tiif Date: Mon, 12 May 2025 09:23:30 +0200 Subject: [PATCH 10/10] Use unreachable instead of panic Co-authored-by: bjorn3 <17426603+bjorn3@users.noreply.github.com> --- compiler/rustc_target/src/callconv/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_target/src/callconv/mod.rs b/compiler/rustc_target/src/callconv/mod.rs index 6aae8bc755602..a141accb73802 100644 --- a/compiler/rustc_target/src/callconv/mod.rs +++ b/compiler/rustc_target/src/callconv/mod.rs @@ -919,7 +919,7 @@ fn conv_to_externabi(conv: &Conv) -> ExternAbi { Conv::AvrNonBlockingInterrupt => ExternAbi::AvrNonBlockingInterrupt, Conv::RiscvInterrupt { kind: RiscvInterruptKind::Machine } => ExternAbi::RiscvInterruptM, Conv::RiscvInterrupt { kind: RiscvInterruptKind::Supervisor } => ExternAbi::RiscvInterruptS, - Conv::Cold | Conv::PreserveAll => panic!("This is deadcode"), + Conv::Cold | Conv::PreserveAll => unreachable!(), } }