|  | // https://github.com/llvm/llvm-project/issues/60775 | 
|  | // | 
|  | // RUN: rm -rf %t | 
|  | // RUN: mkdir -p %t | 
|  | // RUN: split-file %s %t | 
|  | // | 
|  | // RUN: %clang_cc1 -std=c++20 %t/a.cppm -I%t -emit-module-interface -o %t/a.pcm | 
|  | // RUN: %clang_cc1 -std=c++20 %t/b.cpp -fmodule-file=a=%t/a.pcm -verify -fsyntax-only | 
|  | // RUN: %clang_cc1 -std=c++20 %t/c.cppm -I%t -emit-module-interface -o %t/c.pcm | 
|  | // RUN: %clang_cc1 -std=c++20 %t/d.cppm -emit-module-interface -fmodule-file=c=%t/c.pcm -o %t/d.pcm | 
|  | // RUN: %clang_cc1 -std=c++20 %t/e.cpp -fmodule-file=d=%t/d.pcm -fmodule-file=c=%t/c.pcm -verify -fsyntax-only | 
|  | // RUN: %clang_cc1 -std=c++20 %t/f.cppm -emit-module-interface -fmodule-file=c=%t/c.pcm -o %t/f.pcm | 
|  | // RUN: %clang_cc1 -std=c++20 %t/g.cpp -fmodule-file=f=%t/f.pcm -fmodule-file=c=%t/c.pcm  -verify -fsyntax-only | 
|  |  | 
|  | //--- initializer_list.h | 
|  | namespace std { | 
|  | typedef decltype(sizeof(int)) size_t; | 
|  | template<typename T> struct initializer_list { | 
|  | initializer_list(const T *, size_t); | 
|  | T* begin(); | 
|  | T* end(); | 
|  | }; | 
|  | } | 
|  |  | 
|  | //--- a.cppm | 
|  | module; | 
|  | #include "initializer_list.h" | 
|  | export module a; | 
|  | export template<typename> | 
|  | void a() { | 
|  | for (int x : {0}) { | 
|  | } | 
|  | } | 
|  |  | 
|  | //--- b.cpp | 
|  | // expected-no-diagnostics | 
|  | import a; | 
|  | void b() { | 
|  | a<int>(); | 
|  | } | 
|  |  | 
|  | //--- c.cppm | 
|  | module; | 
|  | #include "initializer_list.h" | 
|  | export module c; | 
|  | namespace std { | 
|  | export using std::initializer_list; | 
|  | } | 
|  |  | 
|  | //--- d.cppm | 
|  | export module d; | 
|  | import c; | 
|  | export template<typename> | 
|  | void d() { | 
|  | for (int x : {0}) { | 
|  | } | 
|  | } | 
|  |  | 
|  | //--- e.cpp | 
|  | import d; | 
|  | void e() { | 
|  | for (int x : {0}) { // expected-error {{cannot deduce type of initializer list because std::initializer_list was not found; include <initializer_list>}} | 
|  | } | 
|  | } | 
|  |  | 
|  | template <typename> | 
|  | void ee() { | 
|  | for (int x : {0}) { // expected-error {{cannot deduce type of initializer list because std::initializer_list was not found; include <initializer_list>}} | 
|  | } | 
|  | } | 
|  |  | 
|  | void eee() { | 
|  | ee<int>(); | 
|  | d<int>(); | 
|  | } | 
|  |  | 
|  | //--- f.cppm | 
|  | export module f; | 
|  | export import c; | 
|  |  | 
|  | //--- g.cpp | 
|  | // expected-no-diagnostics | 
|  | import f; | 
|  | void g() { | 
|  | for (int x : {0}) { | 
|  | } | 
|  | } | 
|  |  | 
|  | template <typename> | 
|  | void gg() { | 
|  | for (int x : {0}) { | 
|  | } | 
|  | } | 
|  |  | 
|  | void ggg() { | 
|  | gg<int>(); | 
|  | } |