blob: 54a1e9b77e6e64847d6d40232a6dc734faee0ee4 [file] [log] [blame]
// Test that we won't write additional information into the Reduced BMI if the
// module purview is empty.
//
// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: split-file %s %t
//
// RUN: %clang_cc1 -std=c++20 %t/M.cppm -emit-reduced-module-interface -o %t/M.pcm
// RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-reduced-module-interface -o %t/A.pcm \
// RUN: -fmodule-file=M=%t/M.pcm
// RUN: llvm-bcanalyzer --dump --disable-histogram --show-binary-blobs %t/A.pcm > %t/A.dump
// RUN: cat %t/A.dump | FileCheck %t/A.cppm
//
// RUN: %clang_cc1 -std=c++20 %t/A1.cppm -emit-reduced-module-interface -o %t/A1.pcm \
// RUN: -fmodule-file=M=%t/M.pcm
// RUN: llvm-bcanalyzer --dump --disable-histogram --show-binary-blobs %t/A1.pcm > %t/A1.dump
// RUN: cat %t/A1.dump | FileCheck %t/A1.cppm
//--- foo.h
namespace ns {
template <class C>
class A {
};
extern template class A<short>;
inline A<int> a() { return A<int>(); }
template <class T>
A<T> _av_ = A<T>();
auto _av_1 = _av_<int>;
auto _av_2 = _av_<double>;
template <>
class A<void> {
};
void func(A<int>, ...) {
}
}
struct S {
union {
unsigned int V;
struct {
int v1;
int v2;
ns::A<int> a1;
} WESQ;
};
union {
double d;
struct {
int v1;
unsigned v2;
ns::A<unsigned> a1;
} Another;
};
};
//--- M.cppm
module;
#include "foo.h"
export module M;
export namespace nv {
using ns::A;
using ns::a;
using ns::_av_;
using ns::func;
}
using ::S;
//--- A.cppm
module;
#include "foo.h"
export module A;
import M;
// CHECK-NOT: <DECL_CXX_RECORD
// CHECK-NOT: <DECL_UPDATE_OFFSETS
//--- A1.cppm
module;
import M;
#include "foo.h"
export module A;
// CHECK-NOT: <DECL_CXX_RECORD
// CHECK-NOT: <DECL_UPDATE_OFFSETS