llvm/clang/test/Modules/reduced-bmi-empty-module-purview.cppm

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