| // REQUIRES: !system-windows |
| |
| // RUN: rm -rf %t |
| // RUN: split-file %s %t |
| // RUN: cd %t |
| // |
| // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -emit-module-interface \ |
| // RUN: %t/Mod.cppm -o %t/Mod.pcm |
| // |
| // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 %t/Mod.pcm \ |
| // RUN: -emit-llvm -o - | FileCheck %t/Mod.cppm |
| // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -fmodule-file=Mod=%t/Mod.pcm \ |
| // RUN: %t/Use.cpp -emit-llvm -o - | FileCheck %t/Use.cpp |
| // |
| // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -emit-module-interface \ |
| // RUN: %t/Mod.cppm -o %t/Mod.pcm -DKEY_FUNCTION_INLINE |
| // |
| // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 %t/Mod.pcm \ |
| // RUN: -emit-llvm -o - | FileCheck %t/Mod.cppm -check-prefix=CHECK-INLINE |
| // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -fmodule-file=Mod=%t/Mod.pcm \ |
| // RUN: %t/Use.cpp -emit-llvm -o - | FileCheck %t/Use.cpp -check-prefix=CHECK-INLINE |
| // |
| // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -emit-module-interface \ |
| // RUN: %t/M-A.cppm -o %t/M-A.pcm |
| // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 -fmodule-file=M:A=%t/M-A.pcm \ |
| // RUN: %t/M-B.cppm -emit-llvm -o - | FileCheck %t/M-B.cppm |
| |
| //--- Mod.cppm |
| export module Mod; |
| |
| export class Base { |
| public: |
| virtual ~Base(); |
| }; |
| #ifdef KEY_FUNCTION_INLINE |
| inline |
| #endif |
| Base::~Base() {} |
| |
| // CHECK: @_ZTVW3Mod4Base = unnamed_addr constant |
| // CHECK: @_ZTSW3Mod4Base = constant |
| // CHECK: @_ZTIW3Mod4Base = constant |
| |
| // CHECK-INLINE: @_ZTVW3Mod4Base = linkonce_odr {{.*}}unnamed_addr constant |
| // CHECK-INLINE: @_ZTSW3Mod4Base = linkonce_odr {{.*}}constant |
| // CHECK-INLINE: @_ZTIW3Mod4Base = linkonce_odr {{.*}}constant |
| |
| module :private; |
| int private_use() { |
| Base base; |
| return 43; |
| } |
| |
| //--- Use.cpp |
| import Mod; |
| int use() { |
| Base* base = new Base(); |
| return 43; |
| } |
| |
| // CHECK-NOT: @_ZTSW3Mod4Base = constant |
| // CHECK-NOT: @_ZTIW3Mod4Base = constant |
| // CHECK: @_ZTVW3Mod4Base = external unnamed_addr |
| |
| // CHECK-INLINE: @_ZTVW3Mod4Base = linkonce_odr {{.*}}unnamed_addr constant |
| // CHECK-INLINE: @_ZTSW3Mod4Base = linkonce_odr {{.*}}constant |
| // CHECK-INLINE: @_ZTIW3Mod4Base = linkonce_odr {{.*}}constant |
| |
| // Check the case that the declaration of the key function comes from another |
| // module unit but the definition of the key function comes from the current |
| // module unit. |
| |
| //--- M-A.cppm |
| export module M:A; |
| export class C { |
| public: |
| virtual ~C(); |
| }; |
| |
| int a_use() { |
| C c; |
| return 43; |
| } |
| |
| //--- M-B.cppm |
| export module M:B; |
| import :A; |
| |
| C::~C() {} |
| |
| int b_use() { |
| C c; |
| return 43; |
| } |
| |
| // CHECK: @_ZTVW1M1C = unnamed_addr constant |
| // CHECK: @_ZTSW1M1C = constant |
| // CHECK: @_ZTIW1M1C = constant |