1// RUN: %clang_cc1 -fmodules-ts %s -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %s --implicit-check-not unused_inline --implicit-check-not unused_stastic_global_module
2
3// CHECK-DAG: @extern_var_global_module = external {{(dso_local )?}}global
4// CHECK-DAG: @inline_var_global_module = linkonce_odr {{(dso_local )?}}global
5// CHECK-DAG: @_ZL24static_var_global_module = internal global
6// CHECK-DAG: @_ZL23const_var_global_module = internal constant
7//
8// With strong-ownership, the module is mangled into exported symbols
9// that are attached to a named module.
10// CHECK-DAG: @_ZW6Module19extern_var_exported = external {{(dso_local )?}}global
11// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we
12// can discard this global and its initializer (if any), and other TUs are not
13// permitted to run the initializer for this variable.
14// CHECK-DAG: @_ZW6Module19inline_var_exported = linkonce_odr {{(dso_local )?}}global
15// CHECK-DAG: @_ZW6Module18const_var_exported = {{(dso_local )?}}constant
16//
17// CHECK-DAG: @_ZW6Module25extern_var_module_linkage = external {{(dso_local )?}}global
18// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we
19// can discard this global and its initializer (if any), and other TUs are not
20// permitted to run the initializer for this variable.
21// CHECK-DAG: @_ZW6Module25inline_var_module_linkage = linkonce_odr {{(dso_local )?}}global
22// CHECK-DAG: @_ZW6Module25static_var_module_linkage = {{(dso_local )?}}global
23// CHECK-DAG: @_ZW6Module24const_var_module_linkage = {{(dso_local )?}}constant
24//
25// CHECK-DAG: @_ZW6Module25unused_var_module_linkage = {{(dso_local )?}}global i32 4
26// CHECK-DAG: @_ZW6Module32unused_static_var_module_linkage = {{(dso_local )?}}global i32 5
27// CHECK-DAG: @_ZW6Module31unused_const_var_module_linkage = {{(dso_local )?}}constant i32 7
28
29static void unused_static_global_module() {}
30static void used_static_global_module() {}
31
32inline void unused_inline_global_module() {}
33inline void used_inline_global_module() {}
34
35extern int extern_var_global_module;
36inline int inline_var_global_module;
37static int static_var_global_module;
38const int const_var_global_module = 3;
39
40// CHECK: define {{(dso_local )?}}void {{.*}}@_Z23noninline_global_modulev
41void noninline_global_module() {
42  // FIXME: This should be promoted to module linkage and given a
43  // module-mangled name, if it's called from an inline function within
44  // the module interface.
45  // (We should try to avoid this when it's not reachable from outside
46  // the module interface unit.)
47  // CHECK: define internal {{.*}}@_ZL25used_static_global_modulev
48  used_static_global_module();
49  // CHECK: define linkonce_odr {{.*}}@_Z25used_inline_global_modulev
50  used_inline_global_module();
51
52  (void)&extern_var_global_module;
53  (void)&inline_var_global_module;
54  (void)&static_var_global_module;
55  (void)&const_var_global_module;
56}
57
58export module Module;
59
60export {
61  inline void unused_inline_exported() {}
62  inline void used_inline_exported() {}
63
64  extern int extern_var_exported;
65  inline int inline_var_exported;
66  const int const_var_exported = 3;
67
68  // CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module18noninline_exportedv
69  void noninline_exported() {
70    (void)&extern_var_exported;
71    (void)&inline_var_exported;
72    (void)&const_var_exported;
73  }
74}
75
76// FIXME: Ideally we wouldn't emit this as its name is not visible outside this
77// TU, but this module interface might contain a template that can use this
78// function so we conservatively emit it for now.
79// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module28unused_static_module_linkagev
80static void unused_static_module_linkage() {}
81// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module26used_static_module_linkagev
82static void used_static_module_linkage() {}
83
84inline void unused_inline_module_linkage() {}
85inline void used_inline_module_linkage() {}
86
87extern int extern_var_module_linkage;
88inline int inline_var_module_linkage;
89static int static_var_module_linkage;
90const int const_var_module_linkage = 3;
91
92// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module24noninline_module_linkagev
93void noninline_module_linkage() {
94  used_static_module_linkage();
95  // CHECK: define linkonce_odr {{.*}}@_ZW6Module26used_inline_module_linkagev
96  used_inline_module_linkage();
97
98  (void)&extern_var_module_linkage;
99  (void)&inline_var_module_linkage;
100  (void)&static_var_module_linkage;
101  (void)&const_var_module_linkage;
102}
103
104int unused_var_module_linkage = 4;
105static int unused_static_var_module_linkage = 5;
106inline int unused_inline_var_module_linkage = 6;
107const int unused_const_var_module_linkage = 7;
108
109struct a {
110  struct b {};
111  struct c {};
112};
113// CHECK: define {{(dso_local )?}}void @_ZW6Module1fNS_1a1bENS0_1cE(
114void f(a::b, a::c) {}
115