//@ add-core-stubs //@ edition: 2018 //@ compile-flags: --target thumbv8m.main-none-eabi --crate-type lib //@ needs-llvm-components: arm #![feature(cmse_nonsecure_entry, c_variadic, no_core, lang_items)] #![no_core] extern crate minicore; use minicore::*; #[lang = "va_list"] struct VaList(*mut u8); unsafe extern "cmse-nonsecure-entry" fn c_variadic(_: u32, _: ...) { //~^ ERROR `...` is not supported for `extern "cmse-nonsecure-entry"` functions } // A regression test for https://github.com/rust-lang/rust/issues/132142 async unsafe extern "cmse-nonsecure-entry" fn async_and_c_variadic(_: ...) { //~^ ERROR `...` is not supported for `extern "cmse-nonsecure-entry"` functions //~| ERROR functions cannot be both `async` and C-variadic } // Below are the lang items that are required for a program that defines an `async` function. // Without them, the ICE that is tested for here is not reached for this target. For now they are in // this file, but they may be moved into `minicore` if/when other `#[no_core]` tests want to use // them. // NOTE: in `core` this type uses `NonNull`. #[lang = "ResumeTy"] pub struct ResumeTy(*mut Context<'static>); #[lang = "future_trait"] pub trait Future { /// The type of value produced on completion. #[lang = "future_output"] type Output; // NOTE: misses the `poll` method. } #[lang = "async_drop"] pub trait AsyncDrop { // NOTE: misses the `drop` method. } #[lang = "Poll"] pub enum Poll { #[lang = "Ready"] Ready(T), #[lang = "Pending"] Pending, } #[lang = "Context"] pub struct Context<'a> { // NOTE: misses a bunch of fields. _marker: PhantomData &'a ()>, } #[lang = "get_context"] pub unsafe fn get_context<'a, 'b>(cx: ResumeTy) -> &'a mut Context<'b> { // NOTE: the actual implementation looks different. mem::transmute(cx.0) } #[lang = "pin"] pub struct Pin(T);