diff options
Diffstat (limited to 'clang/test/Modules/GH154840.cpp')
| -rw-r--r-- | clang/test/Modules/GH154840.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/clang/test/Modules/GH154840.cpp b/clang/test/Modules/GH154840.cpp new file mode 100644 index 000000000000..afeb39acb548 --- /dev/null +++ b/clang/test/Modules/GH154840.cpp @@ -0,0 +1,97 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// RUN: cd %t +// +// RUN: %clang_cc1 -fmodule-name=A -fno-cxx-modules -emit-module -fmodules -xc++ A.cppmap -o A.pcm +// RUN: %clang_cc1 -fmodule-name=B -fno-cxx-modules -emit-module -fmodules -xc++ B.cppmap -o B.pcm -fmodule-file=A.pcm +// RUN: %clang_cc1 -fmodule-name=C -fno-cxx-modules -emit-module -fmodules -xc++ C.cppmap -o C.pcm -fmodule-file=A.pcm +// RUN: %clang_cc1 -fmodule-name=D -fno-cxx-modules -emit-module -fmodules -xc++ D.cppmap -o D.pcm -fmodule-file=A.pcm +// RUN: %clang_cc1 -fmodule-name=E -fno-cxx-modules -emit-module -fmodules -xc++ E.cppmap -o E.pcm -fmodule-file=D.pcm -fmodule-file=B.pcm -fmodule-file=C.pcm +// RUN: %clang_cc1 -fno-cxx-modules -fmodules -fmodule-file=B.pcm -fmodule-file=E.pcm -emit-llvm -o /dev/null S.cpp + +//--- A.h +namespace std { + +template <class T> void zz(T); + +template <class> struct vec { + struct w {}; + struct xx {}; + + vec(vec &) { init(); } + constexpr vec &operator=(const vec &); + template <class U> constexpr void pb(U); + constexpr void init(); + + w s; +}; + +template <class T> constexpr void vec<T>::init() { + xx yy; + zz(yy); +} + +template <class T> constexpr vec<T> &vec<T>::operator=(const vec &) { + pb(s); + return *this; +} + +template <class T> template <class U> constexpr void vec<T>::pb(U) { init(); } +} // namespace std + +//--- A.cppmap +module "A" { + header "A.h" +} + +//--- X.h +#pragma clang module import A + +namespace project { + class thing : std::vec<thing> {}; +} // namespace project + +//--- B.h +#include "X.h" + +//--- B.cppmap +module "B" { + header "B.h" +} + +//--- C.h +#include "X.h" + +//--- C.cppmap +module "C" { + header "C.h" +} + +//--- D.h +#include "X.h" + +//--- D.cppmap +module "D" { + header "D.h" +} + +//--- Y.h +#include "X.h" +struct other { + other() : data(data) {} + std::vec<project::thing> data; +}; + +//--- E.h +#include "Y.h" + +//--- E.cppmap +module "E" { + header "E.h" +} + +//--- S.cpp +#pragma clang module import A +#pragma clang module import E +void func(std::vec<project::thing> *a, std::vec<project::thing> *b) { *a = *b; } |
