// 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