11283e986SRichard Smith// 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
21283e986SRichard Smith
3922f2aa9SRafael Espindola// CHECK-DAG: @extern_var_global_module = external {{(dso_local )?}}global
4922f2aa9SRafael Espindola// CHECK-DAG: @inline_var_global_module = linkonce_odr {{(dso_local )?}}global
51283e986SRichard Smith// CHECK-DAG: @_ZL24static_var_global_module = internal global
61283e986SRichard Smith// CHECK-DAG: @_ZL23const_var_global_module = internal constant
71283e986SRichard Smith//
8*ae4dce86SNathan Sidwell// With strong-ownership, the module is mangled into exported symbols
9*ae4dce86SNathan Sidwell// that are attached to a named module.
10*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module19extern_var_exported = external {{(dso_local )?}}global
111283e986SRichard Smith// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we
121283e986SRichard Smith// can discard this global and its initializer (if any), and other TUs are not
131283e986SRichard Smith// permitted to run the initializer for this variable.
14*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module19inline_var_exported = linkonce_odr {{(dso_local )?}}global
15*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module18const_var_exported = {{(dso_local )?}}constant
161283e986SRichard Smith//
17*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module25extern_var_module_linkage = external {{(dso_local )?}}global
181283e986SRichard Smith// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we
191283e986SRichard Smith// can discard this global and its initializer (if any), and other TUs are not
201283e986SRichard Smith// permitted to run the initializer for this variable.
21*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module25inline_var_module_linkage = linkonce_odr {{(dso_local )?}}global
22*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module25static_var_module_linkage = {{(dso_local )?}}global
23*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module24const_var_module_linkage = {{(dso_local )?}}constant
24cd4a7a46SRichard Smith//
25*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module25unused_var_module_linkage = {{(dso_local )?}}global i32 4
26*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module32unused_static_var_module_linkage = {{(dso_local )?}}global i32 5
27*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module31unused_const_var_module_linkage = {{(dso_local )?}}constant i32 7
28b51cf113SRichard Smith
29b51cf113SRichard Smithstatic void unused_static_global_module() {}
30b51cf113SRichard Smithstatic void used_static_global_module() {}
311283e986SRichard Smith
32b51cf113SRichard Smithinline void unused_inline_global_module() {}
33b51cf113SRichard Smithinline void used_inline_global_module() {}
341283e986SRichard Smith
351283e986SRichard Smithextern int extern_var_global_module;
361283e986SRichard Smithinline int inline_var_global_module;
371283e986SRichard Smithstatic int static_var_global_module;
381283e986SRichard Smithconst int const_var_global_module = 3;
391283e986SRichard Smith
40922f2aa9SRafael Espindola// CHECK: define {{(dso_local )?}}void {{.*}}@_Z23noninline_global_modulev
41b51cf113SRichard Smithvoid noninline_global_module() {
42b51cf113SRichard Smith  // FIXME: This should be promoted to module linkage and given a
43b51cf113SRichard Smith  // module-mangled name, if it's called from an inline function within
44b51cf113SRichard Smith  // the module interface.
45b51cf113SRichard Smith  // (We should try to avoid this when it's not reachable from outside
46b51cf113SRichard Smith  // the module interface unit.)
47b51cf113SRichard Smith  // CHECK: define internal {{.*}}@_ZL25used_static_global_modulev
48b51cf113SRichard Smith  used_static_global_module();
49b51cf113SRichard Smith  // CHECK: define linkonce_odr {{.*}}@_Z25used_inline_global_modulev
50b51cf113SRichard Smith  used_inline_global_module();
511283e986SRichard Smith
521283e986SRichard Smith  (void)&extern_var_global_module;
531283e986SRichard Smith  (void)&inline_var_global_module;
541283e986SRichard Smith  (void)&static_var_global_module;
551283e986SRichard Smith  (void)&const_var_global_module;
56b51cf113SRichard Smith}
57b51cf113SRichard Smith
58b51cf113SRichard Smithexport module Module;
59b51cf113SRichard Smith
60b51cf113SRichard Smithexport {
61b51cf113SRichard Smith  inline void unused_inline_exported() {}
62b51cf113SRichard Smith  inline void used_inline_exported() {}
631283e986SRichard Smith
641283e986SRichard Smith  extern int extern_var_exported;
651283e986SRichard Smith  inline int inline_var_exported;
661283e986SRichard Smith  const int const_var_exported = 3;
671283e986SRichard Smith
68*ae4dce86SNathan Sidwell  // CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module18noninline_exportedv
69b51cf113SRichard Smith  void noninline_exported() {
701283e986SRichard Smith    (void)&extern_var_exported;
711283e986SRichard Smith    (void)&inline_var_exported;
721283e986SRichard Smith    (void)&const_var_exported;
73b51cf113SRichard Smith  }
74b51cf113SRichard Smith}
75b51cf113SRichard Smith
761283e986SRichard Smith// FIXME: Ideally we wouldn't emit this as its name is not visible outside this
771283e986SRichard Smith// TU, but this module interface might contain a template that can use this
781283e986SRichard Smith// function so we conservatively emit it for now.
79*ae4dce86SNathan Sidwell// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module28unused_static_module_linkagev
80b51cf113SRichard Smithstatic void unused_static_module_linkage() {}
81*ae4dce86SNathan Sidwell// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module26used_static_module_linkagev
82b51cf113SRichard Smithstatic void used_static_module_linkage() {}
831283e986SRichard Smith
84b51cf113SRichard Smithinline void unused_inline_module_linkage() {}
85b51cf113SRichard Smithinline void used_inline_module_linkage() {}
861283e986SRichard Smith
871283e986SRichard Smithextern int extern_var_module_linkage;
881283e986SRichard Smithinline int inline_var_module_linkage;
891283e986SRichard Smithstatic int static_var_module_linkage;
901283e986SRichard Smithconst int const_var_module_linkage = 3;
911283e986SRichard Smith
92*ae4dce86SNathan Sidwell// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module24noninline_module_linkagev
93b51cf113SRichard Smithvoid noninline_module_linkage() {
94b51cf113SRichard Smith  used_static_module_linkage();
95*ae4dce86SNathan Sidwell  // CHECK: define linkonce_odr {{.*}}@_ZW6Module26used_inline_module_linkagev
96b51cf113SRichard Smith  used_inline_module_linkage();
971283e986SRichard Smith
981283e986SRichard Smith  (void)&extern_var_module_linkage;
991283e986SRichard Smith  (void)&inline_var_module_linkage;
1001283e986SRichard Smith  (void)&static_var_module_linkage;
1011283e986SRichard Smith  (void)&const_var_module_linkage;
102b51cf113SRichard Smith}
103dd8b5337SRichard Smith
104cd4a7a46SRichard Smithint unused_var_module_linkage = 4;
105cd4a7a46SRichard Smithstatic int unused_static_var_module_linkage = 5;
106cd4a7a46SRichard Smithinline int unused_inline_var_module_linkage = 6;
107cd4a7a46SRichard Smithconst int unused_const_var_module_linkage = 7;
108cd4a7a46SRichard Smith
109dd8b5337SRichard Smithstruct a {
110dd8b5337SRichard Smith  struct b {};
111dd8b5337SRichard Smith  struct c {};
112dd8b5337SRichard Smith};
113*ae4dce86SNathan Sidwell// CHECK: define {{(dso_local )?}}void @_ZW6Module1fNS_1a1bENS0_1cE(
114dd8b5337SRichard Smithvoid f(a::b, a::c) {}
115