]> git.lizzy.rs Git - rust.git/blob - src/test/codegen/external-no-mangle-fns.rs
Auto merge of #61212 - alexcrichton:skip-rustc, r=pietroalbini
[rust.git] / src / test / codegen / external-no-mangle-fns.rs
1 // compile-flags: -C no-prepopulate-passes
2 // `#[no_mangle]`d functions always have external linkage, i.e., no `internal` in their `define`s
3
4 #![crate_type = "lib"]
5 #![no_std]
6
7 // CHECK: define void @a()
8 #[no_mangle]
9 fn a() {}
10
11 // CHECK: define void @b()
12 #[no_mangle]
13 pub fn b() {}
14
15 mod private {
16     // CHECK: define void @c()
17     #[no_mangle]
18     fn c() {}
19
20     // CHECK: define void @d()
21     #[no_mangle]
22     pub fn d() {}
23 }
24
25 const HIDDEN: () = {
26     // CHECK: define void @e()
27     #[no_mangle]
28     fn e() {}
29
30     // CHECK: define void @f()
31     #[no_mangle]
32     pub fn f() {}
33 };
34
35 // The surrounding item should not accidentally become external
36 // CHECK: define internal{{.*}} void @_ZN22external_no_mangle_fns1x
37 #[inline(never)]
38 fn x() {
39     // CHECK: define void @g()
40     #[no_mangle]
41     fn g() {
42         x();
43     }
44
45     // CHECK: define void @h()
46     #[no_mangle]
47     pub fn h() {}
48
49     // side effect to keep `x` around
50     unsafe {
51         core::ptr::read_volatile(&42);
52     }
53 }