2018-11-29 23:05:23 +01:00
|
|
|
// compile-flags: -C no-prepopulate-passes
|
2018-11-27 02:59:49 +00:00
|
|
|
// `#[no_mangle]`d functions always have external linkage, i.e., no `internal` in their `define`s
|
2018-09-21 15:58:11 -07:00
|
|
|
|
|
|
|
#![crate_type = "lib"]
|
|
|
|
#![no_std]
|
|
|
|
|
|
|
|
// CHECK: define void @a()
|
|
|
|
#[no_mangle]
|
|
|
|
fn a() {}
|
|
|
|
|
|
|
|
// CHECK: define void @b()
|
|
|
|
#[no_mangle]
|
|
|
|
pub fn b() {}
|
|
|
|
|
|
|
|
mod private {
|
|
|
|
// CHECK: define void @c()
|
|
|
|
#[no_mangle]
|
|
|
|
fn c() {}
|
|
|
|
|
|
|
|
// CHECK: define void @d()
|
|
|
|
#[no_mangle]
|
|
|
|
pub fn d() {}
|
|
|
|
}
|
|
|
|
|
|
|
|
const HIDDEN: () = {
|
|
|
|
// CHECK: define void @e()
|
|
|
|
#[no_mangle]
|
|
|
|
fn e() {}
|
|
|
|
|
|
|
|
// CHECK: define void @f()
|
|
|
|
#[no_mangle]
|
|
|
|
pub fn f() {}
|
|
|
|
};
|
|
|
|
|
|
|
|
// The surrounding item should not accidentally become external
|
2019-04-13 19:03:02 +03:00
|
|
|
// CHECK-LABEL: ; external_no_mangle_fns::x
|
|
|
|
// CHECK-NEXT: ; Function Attrs:
|
|
|
|
// CHECK-NEXT: define internal
|
2018-09-21 15:58:11 -07:00
|
|
|
#[inline(never)]
|
|
|
|
fn x() {
|
|
|
|
// CHECK: define void @g()
|
|
|
|
#[no_mangle]
|
|
|
|
fn g() {
|
|
|
|
x();
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: define void @h()
|
|
|
|
#[no_mangle]
|
|
|
|
pub fn h() {}
|
|
|
|
|
|
|
|
// side effect to keep `x` around
|
|
|
|
unsafe {
|
|
|
|
core::ptr::read_volatile(&42);
|
|
|
|
}
|
|
|
|
}
|