391 lines · cpp
1// RUN: %clang_cc1 -mllvm -emptyline-comment-coverage=false -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -fexceptions -fcxx-exceptions -emit-llvm-only -triple %itanium_abi_triple -main-file-name terminate-statements.cpp -I %S/Inputs %s | FileCheck %s2 3int f1() {4 return 0;5 return 0; // CHECK: Gap,File 0, [[@LINE-1]]:12 -> [[@LINE]]:3 = 06}7 8int f2(int i) {9 if (i)10 return 0;11 else12 ; // CHECK: Gap,File 0, [[@LINE]]:6 -> [[@LINE+1]]:3 = (#0 - #1)13 return 1; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = (#0 - #1)14}15 16int f3() {17 for (int a = 1; a < 9; a--)18 return a; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+1]]:3 = (#0 - #1)19 return 0; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = (#0 - #1)20}21 22int f4(int i) {23 while (i > 0) {24 i++;25 return i;26 } // CHECK: File 0, [[@LINE]]:4 -> [[@LINE+1]]:3 = (#0 - #1)27 return 0; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = (#0 - #1)28}29 30int f5(int i) {31 do {32 return i;33 } while (i > 0); // CHECK: Gap,File 0, [[@LINE]]:19 -> [[@LINE+1]]:3 = (0 - #1)34 return 0; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = (0 - #1)35}36 37int f6() {38 int arr[] = {1, 2, 3, 4};39 for (int i : arr) {40 return i;41 } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+1]]:3 = (#0 - #1)42 return 0; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = (#0 - #1)43}44 45int f7() {46 {47 {48 return 0;49 }50 return 0; // CHECK: Gap,File 0, [[@LINE-1]]:6 -> [[@LINE]]:5 = 051 }52 return 0; // CHECK: Gap,File 0, [[@LINE-1]]:4 -> [[@LINE]]:3 = 053}54 55int f8(int i) {56 if (i == 1)57 return 1; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+1]]:3 = (#0 - #1)58 if (i == 2) // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE+5]]:2 = (#0 - #1)59 return 2; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+1]]:3 = ((#0 - #1) - #2)60 if (i == 3) // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE+3]]:2 = ((#0 - #1) - #2)61 return 3; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+1]]:3 = (((#0 - #1) - #2) - #3)62 return 4; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = (((#0 - #1) - #2) - #3)63}64 65int f9(int i) {66 if (i == 1)67 return 1; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+1]]:8 = (#0 - #1)68 else if (i == 2) // CHECK-NEXT: File 0, [[@LINE]]:8 -> [[@LINE+1]]:13 = (#0 - #1)69 return 2; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+1]]:3 = ((#0 - #1) - #2)70 return 3; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = ((#0 - #1) - #2)71}72 73int f10(int i) {74 if (i == 1) {75 return 0;76 if (i == 2) // CHECK: Gap,File 0, [[@LINE-1]]:14 -> [[@LINE]]:5 = 077 return 0;78 } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+1]]:3 = ((#0 - #1) - #2)79 return 0; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = ((#0 - #1) - #2)80}81 82int f11(int i) {83 if (i == 1)84 i = 2;85 else86 return 0; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+1]]:3 = #187 return 0; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = #188}89 90int f12(int i) {91 int x = 1;92 if (x == 1) {93 if (x == 1) {94 return 0;95 }96 } else if (x == 2) {97 x = 2;98 } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+1]]:3 = (#0 - #2)99 return 1; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = (#0 - #2)100}101 102int f13(int i) {103 if (i == 1) {104 return 0; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+1]]:5 = 0105 if (i == 2) { // CHECK-NEXT: File 0, [[@LINE]]:5 -> [[@LINE+3]]:4 = 0106 i++;107 }108 } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+1]]:3 = (#0 - #1)109 return 0; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = (#0 - #1)110}111 112int f14(int i) {113 while (i == 0) {114 while (i < 10) {115 i++;116 return 0;117 }118 } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+1]]:3 = (#0 - #2)119 return 0; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = (#0 - #2)120}121 122int f15(int i) {123 while (i == 0) {124 return 0; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+1]]:5 = 0125 while (i < 10) { // CHECK-NEXT: File 0, [[@LINE]]:5 -> [[@LINE+3]]:4 = 0126 i++;127 }128 } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+1]]:3 = (#0 - #1)129 return 0; // CHECK-NEXT: File 0, [[@LINE]]:3 -> [[@LINE]]:11 = (#0 - #1)130}131 132int f16(int i) {133 while (i == 0) {134 break;135 return 0;136 }137 return 0; // CHECK-NOT: Gap,File 0, [[@LINE-1]]138}139 140#define IF if141#define STMT(S) S142 143// CHECK-LABEL: _Z3fooi:144void foo(int x) {145 if (x == 0) {146 return;147 } // CHECK-NOT: Gap,File 0, [[@LINE]]:4148 //< Don't complete the last deferred region in a decl, even though it may149 //< leave some whitespace marked with the same counter as the final return.150}151 152// CHECK-LABEL: _Z4foooi:153void fooo(int x) {154 if (x == 0) {155 return;156 } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+2]]:3 = (#0 - #1)157 158 if (x == 1) {159 return;160 } // CHECK-NOT: Gap,File 0, [[@LINE]]:4161 162}163 164// CHECK-LABEL: _Z3bazv:165void baz() { // CHECK: [[@LINE]]:12 -> [[@LINE+2]]:2166 return; // CHECK-NOT: File167}168 169// CHECK-LABEL: _Z4maazv:170void maaz() {171 if (true)172 return; // CHECK: Gap,File 0, [[@LINE]]:12173 else174 return; // CHECK-NOT: Gap,File 0, [[@LINE]]175}176 177// CHECK-LABEL: _Z5maaazv:178void maaaz() {179 if (true) {180 return;181 } else { // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE]]:10182 return; // CHECK-NOT: Gap,File 0, [[@LINE]]183 }184}185 186// CHECK-LABEL: _Z3bari:187void bar(int x) {188 IF (x)189 return; // CHECK: Gap,File 0, [[@LINE]]:12 -> [[@LINE+2]]:3 = (#0 - #1)190 191 IF (!x)192 return; // CHECK: Gap,File 0, [[@LINE]]:12 -> [[@LINE+2]]:3 = ((#0 - #1) - #2)193 194 foo(x);195}196 197// CHECK-LABEL: _Z4quuxi:198void quux(int x) {199 STMT(200 if (x == 0)201 return;)202 203 // CHECK: Gap,File 0, [[@LINE-2]]:13 -> [[@LINE+2]]:3 = (#0 - #1)204 205 if (x == 1)206 STMT(return;)207 208 // CHECK: Gap,File 0, [[@LINE-2]]:18 -> [[@LINE+2]]:3 = ((#0 - #1) - #2)209 210 STMT(211 if (x == 2)212 return;213 214 // CHECK-NOT: [[@LINE-2]]:{{.*}} -> [[@LINE+2]]215 216 if (x == 3)217 return;218 )219}220 221// CHECK-LABEL: _Z8weird_ifv:222void weird_if() {223 int i = 0;224 225 if (false)226 return; // CHECK: Gap,File 0, [[@LINE]]:12 -> [[@LINE+2]]:3 = (#0 - #1)227 228 if (false)229 i++;230 231 if (i + 100 > 0) { // CHECK: [[@LINE]]:20 -> [[@LINE+6]]:4 = #3232 if (false) // CHECK: [[@LINE+1]]:7 -> [[@LINE+1]]:13 = #4233 return; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+2]]:5 = (#3 - #4)234 // CHECK: [[@LINE+1]]:5 -> [[@LINE+1]]:11 = (#3 - #4)235 return;236 237 } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+2]]:3 = ((#0 - #1) - #3)238 239 if (false)240 return; // CHECK-NOT: Gap,File 0, [[@LINE]]:11241}242 243// CHECK-LABEL: _Z8for_loopv:244void for_loop() {245 if (false)246 return; // CHECK: Gap,File 0, [[@LINE]]:12 -> [[@LINE+2]]:3 = (#0 - #1)247 248 for (int i = 0; i < 10; ++i) {249 if (i % 2 == 0)250 continue; // CHECK: Gap,File 0, [[@LINE]]:16 -> [[@LINE+2]]:5 = (#2 - #3)251 252 if (i % 5 == 0)253 break; // CHECK: Gap,File 0, [[@LINE]]:13 -> [[@LINE+2]]:5 = ((#2 - #3) - #4)254 255 int x = i; // CHECK: [[@LINE]]:5 -> [[@LINE+1]]:11 = ((#2 - #3) - #4)256 return; // CHECK-NOT: [[@LINE]]:11 -> [[@LINE+2]]257 258 }259}260 261struct Error {};262 263// CHECK-LABEL: _Z10while_loopv:264void while_loop() {265 if (false)266 return; // CHECK: Gap,File 0, [[@LINE]]:12 -> [[@LINE+2]]:3 = (#0 - #1)267 268 int x = 0;269 while (++x < 10) {270 if (x == 1)271 continue; // CHECK: Gap,File 0, [[@LINE]]:16 -> [[@LINE+2]]:5 = (#2 - #3)272 273 while (++x < 4) {274 if (x == 3)275 break; // CHECK: Gap,File 0, [[@LINE]]:15 -> [[@LINE+2]]:7 = (#4 - #5)276 277 while (++x < 5) {}278 }279 280 if (x == 0)281 throw Error(); // CHECK: Gap,File 0, [[@LINE]]:21 -> [[@LINE+2]]:5 = ((#2 - #3) - #7)282 283 while (++x < 9) {284 if (x == 0)285 break; // CHECK-NOT: [[@LINE]]:14 -> [[@LINE+2]]286 287 }288 }289}290 291// CHECK-LABEL: _Z5gotosv:292void gotos() {293 if (false)294 goto out; // CHECK: Gap,File 0, [[@LINE]]:14 -> [[@LINE+2]]:3 = (#0 - #1)295 296 return; // CHECK: [[@LINE]]:3 -> [[@LINE]]:9 = (#0 - #1)297 298out:299 return; // CHECK-NOT: Gap,File 0, [[@LINE]]:8300}301 302// CHECK-LABEL: _Z8switchesv:303void switches() {304 int x;305 switch (x) {306 case 0:307 return;308 default:309 return; // CHECK-NOT: Gap,File 0, [[@LINE]]310 }311}312 313#include "deferred-region-helper.h"314// CHECK-LABEL: _Z13included_funcv:315// CHECK: Gap,File 0, 2:13 -> 3:5 = #1316// CHECK: Gap,File 0, 3:12 -> 4:3 = (#0 - #1)317 318// CHECK-LABEL: _Z7includev:319void include() {320 included_func();321}322 323// CHECK-LABEL: _Z7ornoretv:324void abort() __attribute__((noreturn));325 326int ornoret(void) {327 ( true || (abort(), 0) ); // CHECK: Gap,File 0, [[@LINE]]:28 -> [[@LINE+1]]:3 = #0328 ( false || (abort(), 0) ); // CHECK: Gap,File 0, [[@LINE]]:29 -> [[@LINE+1]]:3 = 0329 return 0;330}331 332// CHECK-LABEL: _Z17abstractcondnoretv:333int abstractcondnoret(void) {334 ( true ? void (0) : abort() ); // CHECK: Gap,File 0, [[@LINE]]:33 -> [[@LINE+1]]:3 = #1335 ( false ? void (0) : abort() ); // CHECK: Gap,File 0, [[@LINE]]:34 -> [[@LINE+1]]:3 = #2336 ( true ? abort() : void (0) ); // CHECK: Gap,File 0, [[@LINE]]:33 -> [[@LINE+1]]:3 = (#2 - #3)337 ( false ? abort() : void (0) ); // CHECK: Gap,File 0, [[@LINE]]:34 -> [[@LINE+1]]:3 = ((#2 - #3) - #4)338 return 0;339}340 341// CHECK-LABEL: _Z13elsecondnoretv:342int elsecondnoret(void) {343 if (true) {} else {344 true ? void (0) : abort();345 } // CHECK: Gap,File 0, [[@LINE]]:4 -> [[@LINE+1]]:3 = (#1 + #2)346 return 0;347}348 349// CHECK-LABEL: _Z18statementexprnoretb:350int statementexprnoret(bool crash) {351 int rc = ({ if (crash) abort(); 0; }); // CHECK: File 0, [[@LINE]]:35 -> [[@LINE+1]]:12 = (#0 - #1)352 return rc; // CHECK-NOT: Gap353}354 355// CHECK-LABEL: _Z13do_with_breaki:356int do_with_break(int n) {357 do {358 if (n == 87) {359 break;360 } // CHECK: File 0, [[@LINE-2]]:18 -> [[@LINE]]:6 = #2361 } while (0); // CHECK: File 0, [[@LINE]]:12 -> [[@LINE]]:13 = ((#0 + #1) - #2)362 return 0; // CHECK-NOT: Gap,File 0, [[@LINE-1]]:15363}364 365int main() {366 foo(0);367 foo(1);368 fooo(0);369 fooo(1);370 maaz();371 maaaz();372 baz();373 bar(0);374 bar(1);375 quux(0);376 quux(1);377 quux(2);378 quux(3);379 weird_if();380 for_loop();381 while_loop();382 gotos();383 include();384 ornoret();385 abstractcondnoret();386 elsecondnoret();387 statementexprnoret(false);388 do_with_break(0);389 return 0;390}391