1 // RUN: %clang_cc1 -std=c++11 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -fexceptions -fcxx-exceptions -emit-llvm-only -triple %itanium_abi_triple -main-file-name deferred-region.cpp -I %S/Inputs %s | FileCheck %s
2 
3 #define IF if
4 #define STMT(S) S
5 
6 // CHECK-LABEL: _Z3fooi:
foo(int x)7 void foo(int x) {
8   if (x == 0) {
9     return;
10   } // CHECK-NOT: Gap,File 0, [[@LINE]]:4
11     //< Don't complete the last deferred region in a decl, even though it may
12     //< leave some whitespace marked with the same counter as the final return.
13 }
14 
15 // CHECK-LABEL: _Z4foooi:
fooo(int x)16 void fooo(int x) {
17   if (x == 0) {
18     return;
19   } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+2]]:3 = (#0 - #1)
20 
21   if (x == 1) {
22     return;
23   } // CHECK-NOT: Gap,File 0, [[@LINE]]:4
24 
25 }
26 
27 // CHECK-LABEL: _Z3bazv:
baz()28 void baz() { // CHECK: [[@LINE]]:12 -> [[@LINE+2]]:2
29   return;    // CHECK-NOT: File
30 }
31 
32 // CHECK-LABEL: _Z3mazv:
maz()33 void maz() {
34   if (true)
35     return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1)
36 
37   return; // CHECK-NOT: Gap
38 }
39 
40 // CHECK-LABEL: _Z4maazv:
maaz()41 void maaz() {
42   if (true)
43     return; // CHECK: Gap,File 0, [[@LINE]]:11
44   else
45     return; // CHECK-NOT: Gap,File 0, [[@LINE]]
46 }
47 
48 // CHECK-LABEL: _Z5maaazv:
maaaz()49 void maaaz() {
50   if (true) {
51     return;
52   } else {  // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE]]:10
53     return; // CHECK-NOT: Gap,File 0, [[@LINE]]
54   }
55 }
56 
57 // CHECK-LABEL: _Z3bari:
bar(int x)58 void bar(int x) {
59   IF (x)
60     return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1)
61 
62   IF (!x)
63     return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = ((#0 - #1) - #2)
64 
65   foo(x);
66 }
67 
68 // CHECK-LABEL: _Z4quuxi:
69 // Deferred regions are not emitted within macro expansions.
quux(int x)70 void quux(int x) {
71   STMT(
72   if (x == 0)
73     return;)
74 
75   // CHECK-NOT: [[@LINE-2]]:{{.*}} -> [[@LINE+2]]
76 
77   if (x == 1)
78     STMT(return;)
79 
80   // CHECK-NOT: [[@LINE-2]]:{{.*}} -> [[@LINE+3]]
81 
82   STMT(
83   if (x == 2)
84     return;
85 
86   // CHECK-NOT: [[@LINE-2]]:{{.*}} -> [[@LINE+2]]
87 
88   if (x == 3)
89     return;
90   )
91 }
92 
93 // CHECK-LABEL: _Z8weird_ifv:
weird_if()94 void weird_if() {
95   int i = 0;
96 
97   if (false)
98     return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1)
99 
100   if (false)
101     i++;
102 
103   if (i + 100 > 0) { // CHECK: [[@LINE]]:20 -> [[@LINE+6]]:4 = #3
104     if (false)       // CHECK: [[@LINE+1]]:7 -> [[@LINE+1]]:13 = #4
105       return;        // CHECK: Gap,File 0, [[@LINE]]:13 -> [[@LINE+2]]:5 = (#3 - #4)
106                      // CHECK: [[@LINE+1]]:5 -> [[@LINE+3]]:4 = (#3 - #4)
107     return;          // CHECK: Gap,File 0, [[@LINE]]:5 -> [[@LINE+4]]:3 = ((#0 - #1) - #3)
108 
109   }
110 
111   if (false)
112     return; // CHECK-NOT: Gap,File 0, [[@LINE]]:11
113 }
114 
115 // CHECK-LABEL: _Z8for_loopv:
for_loop()116 void for_loop() {
117   if (false)
118     return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1)
119 
120   for (int i = 0; i < 10; ++i) {
121     if (i % 2 == 0)
122       continue; // CHECK: Gap,File 0, [[@LINE]]:15 -> [[@LINE+2]]:5 = (#2 - #3)
123 
124     if (i % 5 == 0)
125       break; // CHECK: Gap,File 0, [[@LINE]]:12 -> [[@LINE+2]]:5 = ((#2 - #3) - #4)
126 
127     int x = i; // CHECK: [[@LINE]]:5 -> [[@LINE+3]]:4 = ((#2 - #3) - #4)
128     return; // CHECK-NOT: [[@LINE]]:11 -> [[@LINE+2]]
129 
130   }
131 }
132 
133 struct Error {};
134 
135 // CHECK-LABEL: _Z10while_loopv:
while_loop()136 void while_loop() {
137   if (false)
138     return; // CHECK: Gap,File 0, [[@LINE]]:11 -> [[@LINE+2]]:3 = (#0 - #1)
139 
140   int x = 0;
141   while (++x < 10) {
142     if (x == 1)
143       continue; // CHECK: Gap,File 0, [[@LINE]]:15 -> [[@LINE+2]]:5 = (#2 - #3)
144 
145     while (++x < 4) {
146       if (x == 3)
147         break; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+2]]:7 = (#4 - #5)
148 
149       while (++x < 5) {}
150     }
151 
152     if (x == 0)
153       throw Error(); // CHECK: Gap,File 0, [[@LINE]]:20 -> [[@LINE+2]]:5 = ((#2 - #3) - #7)
154 
155     while (++x < 9) {
156       if (x == 0)
157         break; // CHECK-NOT: [[@LINE]]:14 -> [[@LINE+2]]
158 
159     }
160   }
161 }
162 
163 // CHECK-LABEL: _Z5gotosv:
gotos()164 void gotos() {
165   if (false)
166     goto out; // CHECK: Gap,File 0, [[@LINE]]:13 -> [[@LINE+2]]:3 = (#0 - #1)
167 
168   return; // CHECK: [[@LINE]]:3 -> [[@LINE+4]]:2 = (#0 - #1)
169 
170 out:
171 	return; // CHECK-NOT: Gap,File 0, [[@LINE]]:8
172 }
173 
174 // CHECK-LABEL: _Z8switchesv:
switches()175 void switches() {
176   int x;
177   switch (x) {
178     case 0:
179       return;
180     default:
181       return; // CHECK-NOT: Gap,File 0, [[@LINE]]
182   }
183 }
184 
185 #include "deferred-region-helper.h"
186 // CHECK-LABEL: _Z13included_funcv:
187 // CHECK:  Gap,File 0, 2:13 -> 3:5 = #1
188 // CHECK:  Gap,File 0, 3:11 -> 4:3 = (#0 - #1)
189 
190 // CHECK-LABEL: _Z7includev:
include()191 void include() {
192   included_func();
193 }
194 
main()195 int main() {
196   foo(0);
197   foo(1);
198   fooo(0);
199   fooo(1);
200   maz();
201   maaz();
202   maaaz();
203   baz();
204   bar(0);
205   bar(1);
206   quux(0);
207   quux(1);
208   quux(2);
209   quux(3);
210   weird_if();
211   for_loop();
212   while_loop();
213   gotos();
214   include();
215   return 0;
216 }
217