xref: /llvm-project/clang/test/CoverageMapping/statement-expression.c (revision c1b6cca1214e7a9c14a30b81585dd8b81baeaa77)
1*c1b6cca1SWentao Zhang // RUN: %clang_cc1 -mllvm -emptyline-comment-coverage=false -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name statement-expression.c %s
2*c1b6cca1SWentao Zhang 
3*c1b6cca1SWentao Zhang // No crash for the following examples, where GNU Statement Expression extension
4*c1b6cca1SWentao Zhang // could introduce region terminators (break, goto etc) before implicit
5*c1b6cca1SWentao Zhang // initializers in a struct or an array.
6*c1b6cca1SWentao Zhang // See https://github.com/llvm/llvm-project/pull/89564
7*c1b6cca1SWentao Zhang 
8*c1b6cca1SWentao Zhang struct Foo {
9*c1b6cca1SWentao Zhang   int field1;
10*c1b6cca1SWentao Zhang   int field2;
11*c1b6cca1SWentao Zhang };
12*c1b6cca1SWentao Zhang 
f1(void)13*c1b6cca1SWentao Zhang void f1(void) {
14*c1b6cca1SWentao Zhang   struct Foo foo = {
15*c1b6cca1SWentao Zhang     .field1 = ({
16*c1b6cca1SWentao Zhang       switch (0) {
17*c1b6cca1SWentao Zhang       case 0:
18*c1b6cca1SWentao Zhang         break; // A region terminator
19*c1b6cca1SWentao Zhang       }
20*c1b6cca1SWentao Zhang       0;
21*c1b6cca1SWentao Zhang     }),
22*c1b6cca1SWentao Zhang     // ImplicitValueInitExpr introduced here for .field2
23*c1b6cca1SWentao Zhang   };
24*c1b6cca1SWentao Zhang }
25*c1b6cca1SWentao Zhang 
f2(void)26*c1b6cca1SWentao Zhang void f2(void) {
27*c1b6cca1SWentao Zhang   int arr[3] = {
28*c1b6cca1SWentao Zhang     [0] = ({
29*c1b6cca1SWentao Zhang         goto L0; // A region terminator
30*c1b6cca1SWentao Zhang L0:
31*c1b6cca1SWentao Zhang       0;
32*c1b6cca1SWentao Zhang     }),
33*c1b6cca1SWentao Zhang     // ImplicitValueInitExpr introduced here for subscript [1]
34*c1b6cca1SWentao Zhang     [2] = 0,
35*c1b6cca1SWentao Zhang   };
36*c1b6cca1SWentao Zhang }
37