// https://github.com/llvm/llvm-project/issues/59765 // FIXME: Since the signature of the constructors/destructors is // different in different targets. The current CHECK can't work // well when targeting or running on AIX and z/OS. // It would be better to add the corresponding test for other test. // UNSUPPORTED: system-zos, system-aix // // RUN: rm -rf %t // RUN: mkdir %t // RUN: split-file %s %t // // RUN: %clang_cc1 -std=c++20 %t/M.cppm -triple %itanium_abi_triple -emit-module-interface -o %t/M.pcm // RUN: %clang_cc1 -std=c++20 %t/M.pcm -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %t/M.cppm // RUN: %clang_cc1 -std=c++20 %t/Use.cpp -fprebuilt-module-path=%t -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %t/Use.cpp // // Check that the behavior of header units is normal as headers. // RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -xc++-user-header %t/foo.h -emit-header-unit -o %t/foo.pcm // RUN: %clang_cc1 -std=c++20 %t/UseHU.cpp -fmodule-file=%t/foo.pcm -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %t/UseHU.cpp //--- M.cppm export module M; export class A { public: A(); ~A(); void use(); }; export A a; // CHECK: @_ZW1M1a = {{.*}}global %class.A zeroinitializer // CHECK: define{{.*}}void @__cxx_global_var_init() // CHECK-NEXT: entry: // CHECK-NEXT: call{{.*}}@_ZNW1M1AC1Ev({{.*}}@_ZW1M1a // CHECK-NEXT: call{{.*}}@__cxa_atexit(ptr @_ZNW1M1AD1Ev, ptr @_ZW1M1a //--- Use.cpp import M; void use() { a.use(); } // CHECK-NOT: @_ZNW1M1AC1Ev // CHECK-NOT: @_ZNW1M1AD1Ev //--- foo.h class A { public: A(); ~A(); void use(); }; A a; //--- UseHU.cpp import "foo.h"; void use() { a.use(); } // CHECK: @a = {{.*}}global %class.A zeroinitializer // CHECK: define{{.*}}void @__cxx_global_var_init() // CHECK-NEXT: entry: // CHECK-NEXT: call{{.*}}@_ZN1AC1Ev({{.*}}@a // CHECK-NEXT: call{{.*}}@__cxa_atexit(ptr @_ZN1AD1Ev, ptr @a