| //@ add-core-stubs |
| //@ build-fail |
| //@ compile-flags: --crate-type=lib --target thumbv4t-none-eabi |
| //@ needs-llvm-components: arm |
| |
| // Checks that forced inlining won't mix asm with incompatible instruction sets. |
| |
| #![crate_type = "lib"] |
| #![feature(rustc_attrs)] |
| #![feature(no_core, lang_items)] |
| #![no_core] |
| |
| extern crate minicore; |
| use minicore::*; |
| |
| #[rustc_builtin_macro] |
| #[macro_export] |
| macro_rules! asm { |
| ("assembly template", |
| $(operands,)* |
| $(options($(option),*))? |
| ) => { |
| /* compiler built-in */ |
| }; |
| } |
| |
| #[instruction_set(arm::a32)] |
| #[rustc_force_inline] |
| fn instruction_set_a32() {} |
| |
| #[instruction_set(arm::t32)] |
| #[rustc_force_inline] |
| fn instruction_set_t32() {} |
| |
| #[rustc_force_inline] |
| fn instruction_set_default() {} |
| |
| #[rustc_force_inline] |
| fn inline_always_and_using_inline_asm() { |
| unsafe { asm!("/* do nothing */") }; |
| } |
| |
| #[instruction_set(arm::t32)] |
| pub fn t32() { |
| instruction_set_a32(); |
| //~^ ERROR `instruction_set_a32` could not be inlined into `t32` but is required to be inlined |
| instruction_set_t32(); |
| instruction_set_default(); |
| inline_always_and_using_inline_asm(); |
| //~^ ERROR `inline_always_and_using_inline_asm` could not be inlined into `t32` but is required to be inlined |
| } |
| |
| pub fn default() { |
| instruction_set_a32(); |
| //~^ ERROR `instruction_set_a32` could not be inlined into `default` but is required to be inlined |
| instruction_set_t32(); |
| //~^ ERROR `instruction_set_t32` could not be inlined into `default` but is required to be inlined |
| instruction_set_default(); |
| inline_always_and_using_inline_asm(); |
| } |