diff options
| author | Stuart Cook <Zalathar@users.noreply.github.com> | 2025-09-30 22:25:16 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-30 22:25:16 +1000 |
| commit | 5a6ac8c322a95e9607d7dc9f5760a60ff44d2c9a (patch) | |
| tree | ef1b237962540cb823e369e8c0b3dbe8900f571e /tests/ui | |
| parent | 1aa426b335ba4b7414deea34e6ecf628469fd98f (diff) | |
| parent | 401857aaa1e21df49e0d013b9856ab6dbe34870b (diff) | |
| download | rust-5a6ac8c322a95e9607d7dc9f5760a60ff44d2c9a.tar.gz rust-5a6ac8c322a95e9607d7dc9f5760a60ff44d2c9a.zip | |
Rollup merge of #146649 - folkertdev:cmse-call-erase-regions, r=lcnr
cmse: fix 'region variables should not be hashed' tracking issue: https://github.com/rust-lang/rust/issues/81391 fixes https://github.com/rust-lang/rust/issues/131639 Some background: the `cmse-nonsecure-call` calling convention is used for a call from "secure" to "non-secure" code. To make sure that "non-secure" cannot read any secrets, restrictions are put on the signatures of functions with this calling convention: they can only use 4 arguments for passing arguments, and one register for passing a result. No arguments are passed via the stack, and all other registers are cleared before the call. We check during `hir_ty_lowering` that the signature follows these rules. We do that by determining and then inspecting the layout of the type. That works well overall, but can run into asserts when the type itself is ill-formed. This PR fixes one such case. I believe that the fix here, just erasing the regions, is the right shape, but there may be some nuance that I'm missing. r? types
Diffstat (limited to 'tests/ui')
| -rw-r--r-- | tests/ui/cmse-nonsecure/cmse-nonsecure-call/undeclared-lifetime.rs | 20 | ||||
| -rw-r--r-- | tests/ui/cmse-nonsecure/cmse-nonsecure-call/undeclared-lifetime.stderr | 19 |
2 files changed, 39 insertions, 0 deletions
diff --git a/tests/ui/cmse-nonsecure/cmse-nonsecure-call/undeclared-lifetime.rs b/tests/ui/cmse-nonsecure/cmse-nonsecure-call/undeclared-lifetime.rs new file mode 100644 index 00000000000..5fa5b74c0c0 --- /dev/null +++ b/tests/ui/cmse-nonsecure/cmse-nonsecure-call/undeclared-lifetime.rs @@ -0,0 +1,20 @@ +//@ add-core-stubs +//@ compile-flags: --target thumbv8m.main-none-eabi --crate-type lib -Cincremental=true +//@ needs-llvm-components: arm +#![feature(abi_cmse_nonsecure_call, no_core)] +#![no_core] + +extern crate minicore; +use minicore::*; + +// A regression test for https://github.com/rust-lang/rust/issues/131639. +// NOTE: -Cincremental=true was required for triggering the bug. + +fn foo() { + id::<extern "cmse-nonsecure-call" fn(&'a ())>(PhantomData); + //~^ ERROR use of undeclared lifetime name `'a` +} + +fn id<T>(x: PhantomData<T>) -> PhantomData<T> { + x +} diff --git a/tests/ui/cmse-nonsecure/cmse-nonsecure-call/undeclared-lifetime.stderr b/tests/ui/cmse-nonsecure/cmse-nonsecure-call/undeclared-lifetime.stderr new file mode 100644 index 00000000000..4aca17e7354 --- /dev/null +++ b/tests/ui/cmse-nonsecure/cmse-nonsecure-call/undeclared-lifetime.stderr @@ -0,0 +1,19 @@ +error[E0261]: use of undeclared lifetime name `'a` + --> $DIR/undeclared-lifetime.rs:14:43 + | +LL | id::<extern "cmse-nonsecure-call" fn(&'a ())>(PhantomData); + | ^^ undeclared lifetime + | + = note: for more information on higher-ranked polymorphism, visit https://doc.rust-lang.org/nomicon/hrtb.html +help: consider making the type lifetime-generic with a new `'a` lifetime + | +LL | id::<for<'a> extern "cmse-nonsecure-call" fn(&'a ())>(PhantomData); + | +++++++ +help: consider introducing lifetime `'a` here + | +LL | fn foo<'a>() { + | ++++ + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0261`. |
