mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 10:56:07 +00:00
131 lines
4.2 KiB
C++
131 lines
4.2 KiB
C++
// 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 -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 -fprebuilt-module-path=%t -o P.pcm
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 P.pcm -emit-llvm \
|
|
// RUN: -fprebuilt-module-path=%t -o - | FileCheck %s --check-prefix=CHECK-P
|
|
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 Q.cpp \
|
|
// RUN: -emit-module-interface -o Q.pcm
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 Q.pcm -emit-llvm \
|
|
// RUN: -o - | FileCheck %s --check-prefix=CHECK-Q
|
|
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 R.cpp \
|
|
// RUN: -emit-module-interface -fprebuilt-module-path=%t -o R.pcm
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 R.pcm -emit-llvm \
|
|
// RUN: -fprebuilt-module-path=%t -o - | FileCheck %s --check-prefix=CHECK-R
|
|
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 S.cpp \
|
|
// RUN: -emit-module-interface -fprebuilt-module-path=%t -o S.pcm
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 S.pcm -emit-llvm \
|
|
// RUN: -fprebuilt-module-path=%t -o - | FileCheck %s --check-prefix=CHECK-S
|
|
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 T.cpp \
|
|
// RUN: -emit-module-interface -fprebuilt-module-path=%t -o T.pcm
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 T.pcm -emit-llvm \
|
|
// RUN: -fprebuilt-module-path=%t -o - | FileCheck %s --check-prefix=CHECK-T
|
|
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 U.cpp \
|
|
// RUN: -emit-module-interface -fprebuilt-module-path=%t -o U.pcm
|
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 U.pcm -emit-llvm \
|
|
// RUN: -fprebuilt-module-path=%t -o - | FileCheck %s --check-prefix=CHECK-U
|
|
|
|
// 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 and all the imported modules don't need inits. So
|
|
// guard variable is not needed.
|
|
//--- P.cpp
|
|
|
|
export module P;
|
|
|
|
export import O;
|
|
export int bar ();
|
|
|
|
// CHECK-P: define void @_ZGIW1P
|
|
// CHECK-P-LABEL: entry
|
|
// CHECK-P-NEXT: ret void
|
|
// CHECK-P-NOT: @_ZGIW1P__in_chrg
|
|
|
|
// This has global inits, so needs a guard.
|
|
//--- Q.cpp
|
|
|
|
export module Q;
|
|
|
|
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 @__cxx_global_var_init
|
|
|
|
// This doesn't have a global init, but it imports a module which needs global
|
|
// init, so needs a guard
|
|
//--- R.cpp
|
|
|
|
export module R;
|
|
export import Q;
|
|
|
|
// CHECK-R: define void @_ZGIW1R
|
|
// CHECK-R: store i8 1, ptr @_ZGIW1R__in_chrg
|
|
// CHECK-R: call{{.*}}@_ZGIW1Q
|
|
|
|
// This doesn't have a global init and the imported module doesn't have variables needs
|
|
// dynamic initialization.
|
|
// But the imported module contains modules initialization. So needs a guard.
|
|
//--- S.cpp
|
|
|
|
export module S;
|
|
export import R;
|
|
|
|
// CHECK-S: define void @_ZGIW1S
|
|
// CHECK-S: store i8 1, ptr @_ZGIW1S__in_chrg
|
|
// CHECK-S: call{{.*}}@_ZGIW1R
|
|
|
|
// The module itself doesn't have a global init and it doesn't import any module.
|
|
// But the global module fragment imports a module that needs an init. So needs a guard.
|
|
//--- T.cpp
|
|
module;
|
|
import S;
|
|
export module T;
|
|
|
|
// CHECK-T: define void @_ZGIW1T
|
|
// CHECK-T: store i8 1, ptr @_ZGIW1T__in_chrg
|
|
// CHECK-T: call{{.*}}@_ZGIW1S
|
|
|
|
// The module itself doesn't have a global init and it doesn't import any module.
|
|
// But the private module fragment imports a module that needs an init. So needs a guard.
|
|
//--- U.cpp
|
|
export module U;
|
|
module :private;
|
|
import T;
|
|
|
|
// CHECK-U: define void @_ZGIW1U
|
|
// CHECK-U: store i8 1, ptr @_ZGIW1U__in_chrg
|
|
// CHECK-U: call{{.*}}@_ZGIW1T
|