178 lines · plain
1// RUN: rm -rf %t2// RUN: mkdir %t3// RUN: split-file %s %t4//5// RUN: %clang_cc1 -std=c++20 %t/Module.cppm -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %t/Module.cppm --implicit-check-not unused6//7// RUN: %clang_cc1 -std=c++20 %t/Module.cppm -triple %itanium_abi_triple -emit-module-interface -o %t/Module.pcm8// RUN: %clang_cc1 -std=c++20 %t/module.cpp -triple %itanium_abi_triple -fmodule-file=Module=%t/Module.pcm -emit-llvm -o - | FileCheck %t/module.cpp --implicit-check-not=unused --implicit-check-not=global_module9//10// RUN: %clang_cc1 -std=c++20 %t/user.cpp -triple %itanium_abi_triple -fmodule-file=Module=%t/Module.pcm -emit-llvm -o - | FileCheck %t/user.cpp --implicit-check-not=unused --implicit-check-not=global_module11 12//--- Module.cppm13// CHECK-DAG: @extern_var_global_module = external {{(dso_local )?}}global14// CHECK-DAG: @inline_var_global_module = linkonce_odr {{(dso_local )?}}global15// CHECK-DAG: @_ZL24static_var_global_module = internal global16// CHECK-DAG: @_ZL23const_var_global_module = internal constant17//18// With strong-ownership, the module is mangled into exported symbols19// that are attached to a named module.20// CHECK-DAG: @_ZW6Module19extern_var_exported = external {{(dso_local )?}}global21// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we22// can discard this global and its initializer (if any), and other TUs are not23// permitted to run the initializer for this variable.24// CHECK-DAG: @_ZW6Module19inline_var_exported = linkonce_odr {{(dso_local )?}}global25// CHECK-DAG: @_ZW6Module18const_var_exported = {{(dso_local )?}}constant26//27// CHECK-DAG: @_ZW6Module25extern_var_module_linkage = external {{(dso_local )?}}global28// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we29// can discard this global and its initializer (if any), and other TUs are not30// permitted to run the initializer for this variable.31// CHECK-DAG: @_ZW6Module25inline_var_module_linkage = linkonce_odr {{(dso_local )?}}global32// CHECK-DAG: @_ZL25static_var_module_linkage = internal33// CHECK-DAG: @_ZW6Module24const_var_module_linkage = {{(dso_local )?}}constant34//35// CHECK-DAG: @_ZW6Module25unused_var_module_linkage = {{(dso_local )?}}global i32 436 37module;38 39static void unused_static_global_module() {}40static void used_static_global_module() {}41 42inline void unused_inline_global_module() {}43inline void used_inline_global_module() {}44 45extern int extern_var_global_module;46inline int inline_var_global_module;47static int static_var_global_module;48const int const_var_global_module = 3;49 50// CHECK: define {{(dso_local )?}}void {{.*}}@_Z23noninline_global_modulev51void noninline_global_module() {52 // FIXME: This should be promoted to module linkage and given a53 // module-mangled name, if it's called from an inline function within54 // the module interface.55 // (We should try to avoid this when it's not reachable from outside56 // the module interface unit.)57 // CHECK: define internal {{.*}}@_ZL25used_static_global_modulev58 used_static_global_module();59 // CHECK: define linkonce_odr {{.*}}@_Z25used_inline_global_modulev60 used_inline_global_module();61 62 (void)&extern_var_global_module;63 (void)&inline_var_global_module;64 (void)&static_var_global_module;65 (void)&const_var_global_module;66}67 68export module Module;69 70export {71 inline void unused_inline_exported() {}72 inline void used_inline_exported() {}73 74 extern int extern_var_exported;75 inline int inline_var_exported;76 const int const_var_exported = 3;77 78 // CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module18noninline_exportedv79 void noninline_exported() {80 (void)&extern_var_exported;81 (void)&inline_var_exported;82 (void)&const_var_exported;83 }84}85 86static void unused_static_module_linkage() {}87 88static void used_static_module_linkage() {}89 90inline void unused_inline_module_linkage() {}91inline void used_inline_module_linkage() {}92 93extern int extern_var_module_linkage;94inline int inline_var_module_linkage;95static int static_var_module_linkage;96const int const_var_module_linkage = 3;97 98// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module24noninline_module_linkagev99// CHECK: define {{.*}}void {{.*}}@_ZL26used_static_module_linkagev100void noninline_module_linkage() {101 used_static_module_linkage();102 // CHECK: define linkonce_odr {{.*}}@_ZW6Module26used_inline_module_linkagev103 used_inline_module_linkage();104 105 (void)&extern_var_module_linkage;106 (void)&inline_var_module_linkage;107 (void)&static_var_module_linkage;108 (void)&const_var_module_linkage;109}110 111int unused_var_module_linkage = 4;112static int unused_static_var_module_linkage = 5;113inline int unused_inline_var_module_linkage = 6;114const int unused_const_var_module_linkage = 7;115 116struct a {117 struct b {};118 struct c {};119};120// CHECK: define {{(dso_local )?}}void @_ZW6Module1fNS_1a1bENS0_1cE(121void f(a::b, a::c) {}122 123//--- module.cpp124 125// CHECK-DAG: @_ZW6Module19extern_var_exported = external {{(dso_local )?}}global126// CHECK-DAG: @_ZW6Module19inline_var_exported = linkonce_odr {{(dso_local )?}}global127// CHECK-DAG: @_ZW6Module18const_var_exported = available_externally {{(dso_local )?}}constant i32 3,128//129// CHECK-DAG: @_ZW6Module25extern_var_module_linkage = external {{(dso_local )?}}global130// CHECK-DAG: @_ZW6Module25inline_var_module_linkage = linkonce_odr {{(dso_local )?}}global131// CHECK-DAG: @_ZW6Module24const_var_module_linkage = available_externally {{(dso_local )?}}constant i32 3,132 133module Module;134 135void use() {136 // CHECK: define linkonce_odr {{.*}}@_ZW6Module20used_inline_exportedv137 used_inline_exported();138 // CHECK: declare {{.*}}@_ZW6Module18noninline_exportedv139 noninline_exported();140 141 (void)&extern_var_exported;142 (void)&inline_var_exported;143 (void)&const_var_exported;144 145 // CHECK: define linkonce_odr {{.*}}@_ZW6Module26used_inline_module_linkagev146 used_inline_module_linkage();147 148 // CHECK: declare {{.*}}@_ZW6Module24noninline_module_linkagev149 noninline_module_linkage();150 151 (void)&extern_var_module_linkage;152 (void)&inline_var_module_linkage;153 154 (void)&const_var_module_linkage; // FIXME: will be visible after P2788R0155}156 157//--- user.cpp158 159// CHECK-DAG: @_ZW6Module19extern_var_exported = external {{(dso_local )?}}global160// CHECK-DAG: @_ZW6Module19inline_var_exported = linkonce_odr {{(dso_local )?}}global161// CHECK-DAG: @_ZW6Module18const_var_exported = available_externally {{(dso_local )?}}constant i32 3162 163import Module;164 165void use() {166 // CHECK: define linkonce_odr {{.*}}@_ZW6Module20used_inline_exportedv167 used_inline_exported();168 // CHECK: declare {{.*}}@_ZW6Module18noninline_exportedv169 noninline_exported();170 171 (void)&extern_var_exported;172 (void)&inline_var_exported;173 (void)&const_var_exported;174 175 // Internal-linkage declarations are not visible here.176 // Module-linkage declarations are not visible here.177}178