Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / Modules / pr60775.cppm
blob4db027ba3600a98fe8032668545c63c1edd73c53
1 // https://github.com/llvm/llvm-project/issues/60775
2 //
3 // RUN: rm -rf %t
4 // RUN: mkdir -p %t
5 // RUN: split-file %s %t
6 //
7 // RUN: %clang_cc1 -std=c++20 %t/a.cppm -I%t -emit-module-interface -o %t/a.pcm
8 // RUN: %clang_cc1 -std=c++20 %t/b.cpp -fmodule-file=a=%t/a.pcm -verify -fsyntax-only
9 // RUN: %clang_cc1 -std=c++20 %t/c.cppm -I%t -emit-module-interface -o %t/c.pcm
10 // RUN: %clang_cc1 -std=c++20 %t/d.cppm -emit-module-interface -fmodule-file=c=%t/c.pcm -o %t/d.pcm
11 // RUN: %clang_cc1 -std=c++20 %t/e.cpp -fmodule-file=d=%t/d.pcm -fmodule-file=c=%t/c.pcm -verify -fsyntax-only
12 // RUN: %clang_cc1 -std=c++20 %t/f.cppm -emit-module-interface -fmodule-file=c=%t/c.pcm -o %t/f.pcm
13 // RUN: %clang_cc1 -std=c++20 %t/g.cpp -fmodule-file=f=%t/f.pcm -fmodule-file=c=%t/c.pcm  -verify -fsyntax-only
15 //--- initializer_list.h
16 namespace std {
17   typedef decltype(sizeof(int)) size_t;
18   template<typename T> struct initializer_list {
19     initializer_list(const T *, size_t);
20     T* begin();
21     T* end();
22   };
25 //--- a.cppm
26 module;
27 #include "initializer_list.h"
28 export module a;
29 export template<typename>
30 void a() {
31         for (int x : {0}) {
32         }
35 //--- b.cpp
36 // expected-no-diagnostics
37 import a;
38 void b() {
39         a<int>();
42 //--- c.cppm
43 module;
44 #include "initializer_list.h"
45 export module c;
46 namespace std {
47     export using std::initializer_list;
50 //--- d.cppm
51 export module d;
52 import c;
53 export template<typename>
54 void d() {
55         for (int x : {0}) {
56         }
59 //--- e.cpp
60 import d;
61 void e() {
62     for (int x : {0}) { // expected-error {{cannot deduce type of initializer list because std::initializer_list was not found; include <initializer_list>}}
63         }
66 template <typename>
67 void ee() {
68     for (int x : {0}) { // expected-error {{cannot deduce type of initializer list because std::initializer_list was not found; include <initializer_list>}}
69     }
72 void eee() {
73     ee<int>();
74     d<int>();
77 //--- f.cppm
78 export module f;
79 export import c;
81 //--- g.cpp
82 // expected-no-diagnostics
83 import f;
84 void g() {
85     for (int x : {0}) {
86         }
89 template <typename>
90 void gg() {
91     for (int x : {0}) {
92     }
95 void ggg() {
96     gg<int>();