| // RUN: %clang_cc1 -std=c++14 -fmodules %s -verify |
| // RUN: %clang_cc1 -std=c++14 -fmodules %s -verify -triple i686-windows |
| // expected-no-diagnostics |
| #pragma clang module build A |
| #pragma clang module contents |
| #pragma clang module begin A |
| template<typename T> struct ct { friend auto operator-(ct, ct) { struct X {}; return X(); } void x(); }; |
| #pragma clang module endbuild |
| #pragma clang module build B |
| #pragma clang module contents |
| #pragma clang module begin B |
| template<typename T> struct ct { friend auto operator-(ct, ct) { struct X{}; return X(); } void x(); }; |
| inline auto f() { return ct<float>() - ct<float>(); } |
| #pragma clang module endbuild |
| // Force the definition of ct in module A to be the primary definition. |
| #pragma clang module import A |
| template<typename T> void ct<T>::x() {} |
| // Attempt to cause the definition of operator- in the ct primary template in |
| // module B to be the primary definition of that function. If that happens, |
| // we'll be left with a class template ct that appears to not contain a |
| // definition of the inline friend function. |
| #pragma clang module import B |