| // REQUIRES: !system-windows |
| |
| // RUN: rm -rf %t |
| // RUN: split-file %s %t |
| // RUN: cd %t |
| // |
| // RUN: %clang_cc1 -std=c++20 %t/layer1.cppm -triple %itanium_abi_triple \ |
| // RUN: -emit-module-interface -o %t/foo-layer1.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/layer2.cppm -triple %itanium_abi_triple \ |
| // RUN: -emit-module-interface -fmodule-file=foo:layer1=%t/foo-layer1.pcm \ |
| // RUN: -o %t/foo-layer2.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/foo-layer1.pcm -emit-llvm -o - | FileCheck %t/layer1.cppm |
| // RUN: %clang_cc1 -std=c++20 %t/foo-layer2.pcm -emit-llvm -o - \ |
| // RUN: -fmodule-file=foo:layer1=%t/foo-layer1.pcm | FileCheck %t/layer2.cppm |
| // |
| // Check the case about emitting object files from sources directly. |
| // RUN: %clang_cc1 -std=c++20 %t/layer1.cppm -triple %itanium_abi_triple \ |
| // RUN: -emit-llvm -o - | FileCheck %t/layer1.cppm |
| // RUN: %clang_cc1 -std=c++20 %t/layer2.cppm -triple %itanium_abi_triple -emit-llvm \ |
| // RUN: -fmodule-file=foo:layer1=%t/foo-layer1.pcm -o - | FileCheck %t/layer2.cppm |
| |
| //--- layer1.cppm |
| export module foo:layer1; |
| struct Fruit { |
| virtual ~Fruit() = default; |
| virtual void eval(); |
| }; |
| |
| // CHECK-DAG: @_ZTVW3foo5Fruit = unnamed_addr constant |
| // CHECK-DAG: @_ZTSW3foo5Fruit = constant |
| // CHECK-DAG: @_ZTIW3foo5Fruit = constant |
| |
| // Testing that: |
| // (1) The use of virtual functions won't produce the vtable. |
| // (2) The definition of key functions won't produce the vtable. |
| // |
| //--- layer2.cppm |
| export module foo:layer2; |
| import :layer1; |
| export void layer2_fun() { |
| Fruit *b = new Fruit(); |
| b->eval(); |
| } |
| void Fruit::eval() {} |
| // CHECK: @_ZTVW3foo5Fruit = external unnamed_addr constant |
| // CHECK-NOT: @_ZTSW3foo5Fruit |
| // CHECK-NOT: @_ZTIW3foo5Fruit |