Hahnfeld created this revision. Hahnfeld added reviewers: rsmith, ChuanqiXu. Herald added a project: All. Hahnfeld requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This is a reduced test case originally meant to be addressed by https://reviews.llvm.org/D137787. It was recently fixed by commit rG61c7a9140b <https://reviews.llvm.org/rG61c7a9140becb19c5b1bc644e54452c6f782f5d5> ("Commit to a primary definition for a class when we load its first member."), noting the difficulty to come up with a reduced test case. This setup with four modules seems to fail consistently before the fix mentioned above. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D156806 Files: clang/test/Modules/merge-template-members-parent.cpp Index: clang/test/Modules/merge-template-members-parent.cpp =================================================================== --- /dev/null +++ clang/test/Modules/merge-template-members-parent.cpp @@ -0,0 +1,64 @@ +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: split-file %s %t + +// RUN: %clang_cc1 -emit-obj -fmodules -fimplicit-module-maps -fmodules-cache-path=%t %t/merge.cpp -o %t/merge.o + +//--- V.h +#ifndef V_H +#define V_H +template <typename T> +struct V { + ~V() {} +}; +#endif + +//--- A.h +#include "V.h" + +void A(const V<unsigned long> &v); + +//--- B.h +#include "V.h" + +inline V<unsigned long> B() { + return {}; +} + +//--- C.h +#include "V.h" + +#include "A.h" + +class C { +public: + C(const V<unsigned long> &v) { + V<unsigned long> v2; + } +}; + +C GetC() { + return {{}}; +} + +// This include *MUST* come last. +#include "B.h" + +//--- module.modulemap +module "V" { header "V.h" export * } +module "A" { header "A.h" export * } +module "B" { header "B.h" export * } +module "C" { header "C.h" export * } + +//--- merge.cpp +#include "C.h" + +template <typename T> +C GetC_main() { + return {{}}; +} + +void f() { + GetC_main<float>(); + GetC(); +}
Index: clang/test/Modules/merge-template-members-parent.cpp =================================================================== --- /dev/null +++ clang/test/Modules/merge-template-members-parent.cpp @@ -0,0 +1,64 @@ +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: split-file %s %t + +// RUN: %clang_cc1 -emit-obj -fmodules -fimplicit-module-maps -fmodules-cache-path=%t %t/merge.cpp -o %t/merge.o + +//--- V.h +#ifndef V_H +#define V_H +template <typename T> +struct V { + ~V() {} +}; +#endif + +//--- A.h +#include "V.h" + +void A(const V<unsigned long> &v); + +//--- B.h +#include "V.h" + +inline V<unsigned long> B() { + return {}; +} + +//--- C.h +#include "V.h" + +#include "A.h" + +class C { +public: + C(const V<unsigned long> &v) { + V<unsigned long> v2; + } +}; + +C GetC() { + return {{}}; +} + +// This include *MUST* come last. +#include "B.h" + +//--- module.modulemap +module "V" { header "V.h" export * } +module "A" { header "A.h" export * } +module "B" { header "B.h" export * } +module "C" { header "C.h" export * } + +//--- merge.cpp +#include "C.h" + +template <typename T> +C GetC_main() { + return {{}}; +} + +void f() { + GetC_main<float>(); + GetC(); +}
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits