blob: a01cf0c7bef6b922b87b2c5a20911dc03e2edb70 [file] [edit]
// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: split-file %s %t
//
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -emit-reduced-module-interface %t/lock.cppm -o %t/lock.pcm
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -emit-reduced-module-interface %t/queue.cppm -o %t/queue.pcm -fprebuilt-module-path=%t
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple -emit-reduced-module-interface %t/threadpool.cppm -o %t/threadpool.pcm -fprebuilt-module-path=%t
// RUN: %clang_cc1 -std=c++20 -triple %itanium_abi_triple %t/user.cppm -o %t/user.pcm -fprebuilt-module-path=%t -emit-llvm -o - | FileCheck %t/user.cppm
//--- lock.h
#pragma once
namespace std {
struct mutex {
void lock() {}
void unlock() {}
};
template <class T>
struct lock_guard {
lock_guard(T &m) : m(m) {
m.lock();
}
~lock_guard() {
m.unlock();
}
T &m;
};
}
//--- lock.cppm
module;
#include "lock.h"
export module lock;
namespace std {
export using ::std::mutex;
export using ::std::lock_guard;
}
//--- queue.cppm
export module queue;
import lock;
export template <class T>
class queue {
public:
void push(T value) {
std::lock_guard<std::mutex> lock(m_mutex);
}
T pop() {
std::lock_guard<std::mutex> lock(m_mutex);
return T{};
}
private:
std::mutex m_mutex;
};
//--- threadpool.cppm
export module threadpool;
import queue;
export class threadpool {
public:
void add_task();
int pop_task();
private:
queue<int> m_queue;
};
inline void threadpool::add_task() {
m_queue.push(42);
}
inline int threadpool::pop_task() {
return m_queue.pop();
}
//--- user.cppm
export module user;
import threadpool;
export class user {
public:
void run() {
m_threadpool.add_task();
m_threadpool.pop_task();
}
private:
threadpool m_threadpool;
};
// CHECK: define {{.*}}@_ZNSt10lock_guardISt5mutexED1Ev(