mirror of https://github.com/rust-lang/rust
76 lines
1.5 KiB
Rust
76 lines
1.5 KiB
Rust
//@ compile-flags: -C no-prepopulate-passes
|
|
// `#[no_mangle]`d functions always have external linkage, i.e., no `internal` in their `define`s
|
|
|
|
#![crate_type = "lib"]
|
|
#![no_std]
|
|
|
|
// CHECK: define{{( dso_local)?}} void @a()
|
|
#[no_mangle]
|
|
fn a() {}
|
|
|
|
// CHECK: define{{( dso_local)?}} void @b()
|
|
#[no_mangle]
|
|
pub fn b() {}
|
|
|
|
mod private {
|
|
// CHECK: define{{( dso_local)?}} void @c()
|
|
#[no_mangle]
|
|
fn c() {}
|
|
|
|
// CHECK: define{{( dso_local)?}} void @d()
|
|
#[no_mangle]
|
|
pub fn d() {}
|
|
}
|
|
|
|
const HIDDEN: () = {
|
|
// CHECK: define{{( dso_local)?}} void @e()
|
|
#[no_mangle]
|
|
fn e() {}
|
|
|
|
// CHECK: define{{( dso_local)?}} void @f()
|
|
#[no_mangle]
|
|
pub fn f() {}
|
|
};
|
|
|
|
// The surrounding item should not accidentally become external
|
|
// CHECK-LABEL: ; external_no_mangle_fns::x
|
|
// CHECK-NEXT: ; Function Attrs:
|
|
// CHECK-NEXT: define internal
|
|
#[inline(never)]
|
|
fn x() {
|
|
// CHECK: define{{( dso_local)?}} void @g()
|
|
#[no_mangle]
|
|
fn g() {
|
|
x();
|
|
}
|
|
|
|
// CHECK: define{{( dso_local)?}} void @h()
|
|
#[no_mangle]
|
|
pub fn h() {}
|
|
|
|
// side effect to keep `x` around
|
|
unsafe {
|
|
core::ptr::read_volatile(&42);
|
|
}
|
|
}
|
|
|
|
// CHECK: define{{( dso_local)?}} void @i()
|
|
#[no_mangle]
|
|
#[inline]
|
|
fn i() {}
|
|
|
|
// CHECK: define{{( dso_local)?}} void @j()
|
|
#[no_mangle]
|
|
#[inline]
|
|
pub fn j() {}
|
|
|
|
// CHECK: define{{( dso_local)?}} void @k()
|
|
#[no_mangle]
|
|
#[inline(always)]
|
|
fn k() {}
|
|
|
|
// CHECK: define{{( dso_local)?}} void @l()
|
|
#[no_mangle]
|
|
#[inline(always)]
|
|
pub fn l() {}
|