| Nemanja Ivanovic | db64e7e | 2019-02-05 12:05:53 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -std=c++14 -fmodules %s -verify | 
|  | 2 | // RUN: %clang_cc1 -std=c++14 -fmodules %s -verify -triple i686-windows | 
| Richard Smith | 0b70de1 | 2018-06-28 01:07:28 +0000 | [diff] [blame] | 3 | // expected-no-diagnostics | 
|  | 4 | #pragma clang module build A | 
|  | 5 | module A {} | 
|  | 6 | #pragma clang module contents | 
|  | 7 | #pragma clang module begin A | 
|  | 8 | template<typename T> struct ct { friend auto operator-(ct, ct) { struct X {}; return X(); } void x(); }; | 
|  | 9 | #pragma clang module end | 
|  | 10 | #pragma clang module endbuild | 
|  | 11 |  | 
|  | 12 | #pragma clang module build B | 
|  | 13 | module B {} | 
|  | 14 | #pragma clang module contents | 
|  | 15 | #pragma clang module begin B | 
|  | 16 | template<typename T> struct ct { friend auto operator-(ct, ct) { struct X{}; return X(); } void x(); }; | 
|  | 17 | inline auto f() { return ct<float>() - ct<float>(); } | 
|  | 18 | #pragma clang module end | 
|  | 19 | #pragma clang module endbuild | 
|  | 20 |  | 
|  | 21 | // Force the definition of ct in module A to be the primary definition. | 
|  | 22 | #pragma clang module import A | 
|  | 23 | template<typename T> void ct<T>::x() {} | 
|  | 24 |  | 
|  | 25 | // Attempt to cause the definition of operator- in the ct primary template in | 
|  | 26 | // module B to be the primary definition of that function. If that happens, | 
|  | 27 | // we'll be left with a class template ct that appears to not contain a | 
|  | 28 | // definition of the inline friend function. | 
|  | 29 | #pragma clang module import B | 
|  | 30 | auto v = f(); | 
|  | 31 |  | 
|  | 32 | ct<int> make(); | 
|  | 33 | void h() { | 
|  | 34 | make() - make(); | 
|  | 35 | } |