// RUN: %clang_cc1 -fmodules %s -verify // RUN: %clang_cc1 -fmodules %s -verify -triple i686-windows // expected-no-diagnostics #pragma clang module build A module 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 end #pragma clang module endbuild #pragma clang module build B module 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 end #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 auto v = f(); ct<int> make(); void h() { make() - make(); } |