// RUN: rm -rf %t // RUN: split-file %s %t // RUN: cd %t // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 O.cpp \ // RUN: -emit-module-interface -o O.pcm // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 O.pcm -S -emit-llvm \ // RUN: -o - | FileCheck %s --check-prefix=CHECK-O // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 P.cpp \ // RUN: -emit-module-interface -fmodule-file=O.pcm -o P.pcm // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 P.pcm -S -emit-llvm \ // RUN: -o - | FileCheck %s --check-prefix=CHECK-P // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 Q.cpp \ // RUN: -emit-module-interface -fmodule-file=O.pcm -o Q.pcm // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 Q.pcm -S -emit-llvm \ // RUN: -o - | FileCheck %s --check-prefix=CHECK-Q // Testing cases where we can elide the module initializer guard variable. // This module has no global inits and does not import any other module //--- O.cpp export module O; export int foo (); // CHECK-O: define void @_ZGIW1O // CHECK-O-LABEL: entry // CHECK-O-NEXT: ret void // CHECK-O-NOT: @_ZGIW1O__in_chrg // This has no global inits but imports a module, and therefore needs a guard // variable. //--- P.cpp export module P; export import O; export int bar (); // CHECK-P: define void @_ZGIW1P // CHECK-P-LABEL: init // CHECK-P: store i8 1, ptr @_ZGIW1P__in_chrg // CHECK-P: call void @_ZGIW1O() // CHECK-P-NOT: call void @__cxx_global_var_init // This imports a module and has global inits, so needs a guard. //--- Q.cpp export module Q; export import O; export struct Quack { Quack(){}; }; export Quack Duck; export int baz (); // CHECK-Q: define internal void @__cxx_global_var_init // CHECK-Q: call {{.*}} @_ZNW1Q5QuackC1Ev // CHECK-Q: define void @_ZGIW1Q // CHECK-Q: store i8 1, ptr @_ZGIW1Q__in_chrg // CHECK-Q: call void @_ZGIW1O() // CHECK-Q: call void @__cxx_global_var_init