xref: /aosp_15_r20/external/clang/test/CoverageMapping/macro-expansion.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name macro-expansion.c %s | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // CHECK: func
4*67e74705SXin Li // CHECK:      File 1, [[@LINE+5]]:12 -> [[@LINE+5]]:38 = #0
5*67e74705SXin Li // CHECK-NEXT: File 1, [[@LINE+4]]:15 -> [[@LINE+4]]:28 = (#0 + #2)
6*67e74705SXin Li // CHECK-NEXT: File 1, [[@LINE+3]]:21 -> [[@LINE+3]]:22 = (#0 + #2)
7*67e74705SXin Li // CHECK-NEXT: File 1, [[@LINE+2]]:24 -> [[@LINE+2]]:26 = #3
8*67e74705SXin Li // CHECK-NEXT: File 1, [[@LINE+1]]:36 -> [[@LINE+1]]:37 = (#0 + #2)
9*67e74705SXin Li #define M1 do { if (0) {} } while (0)
10*67e74705SXin Li // CHECK-NEXT: File 2, [[@LINE+10]]:15 -> [[@LINE+10]]:41 = #0
11*67e74705SXin Li // CHECK-NEXT: File 2, [[@LINE+9]]:18 -> [[@LINE+9]]:31 = (#0 + #4)
12*67e74705SXin Li // CHECK-NEXT: File 2, [[@LINE+8]]:24 -> [[@LINE+8]]:25 = (#0 + #4)
13*67e74705SXin Li // CHECK-NEXT: File 2, [[@LINE+7]]:27 -> [[@LINE+7]]:29 = #5
14*67e74705SXin Li // CHECK-NEXT: File 2, [[@LINE+6]]:39 -> [[@LINE+6]]:40 = (#0 + #4)
15*67e74705SXin Li // CHECK-NEXT: File 3, [[@LINE+5]]:15 -> [[@LINE+5]]:41 = #0
16*67e74705SXin Li // CHECK-NEXT: File 3, [[@LINE+4]]:18 -> [[@LINE+4]]:31 = (#0 + #6)
17*67e74705SXin Li // CHECK-NEXT: File 3, [[@LINE+3]]:24 -> [[@LINE+3]]:25 = (#0 + #6)
18*67e74705SXin Li // CHECK-NEXT: File 3, [[@LINE+2]]:27 -> [[@LINE+2]]:29 = #7
19*67e74705SXin Li // CHECK-NEXT: File 3, [[@LINE+1]]:39 -> [[@LINE+1]]:40 = (#0 + #6)
20*67e74705SXin Li #define M2(x) do { if (x) {} } while (0)
21*67e74705SXin Li // CHECK-NEXT: File 4, [[@LINE+4]]:15 -> [[@LINE+4]]:38 = #0
22*67e74705SXin Li // CHECK-NEXT: File 4, [[@LINE+3]]:18 -> [[@LINE+3]]:28 = (#0 + #8)
23*67e74705SXin Li // CHECK-NEXT: Expansion,File 4, [[@LINE+2]]:20 -> [[@LINE+2]]:22 = (#0 + #8)
24*67e74705SXin Li // CHECK-NEXT: File 4, [[@LINE+1]]:36 -> [[@LINE+1]]:37 = (#0 + #8)
25*67e74705SXin Li #define M3(x) do { M2(x); } while (0)
26*67e74705SXin Li // CHECK-NEXT: File 5, [[@LINE+2]]:15 -> [[@LINE+2]]:27 = #0
27*67e74705SXin Li // CHECK-NEXT: File 5, [[@LINE+1]]:23 -> [[@LINE+1]]:26 = #12
28*67e74705SXin Li #define M4(x) ((x) && (x))
29*67e74705SXin Li // CHECK-NEXT: File 6, [[@LINE+2]]:15 -> [[@LINE+2]]:27 = #0
30*67e74705SXin Li // CHECK-NEXT: File 6, [[@LINE+1]]:23 -> [[@LINE+1]]:26 = #14
31*67e74705SXin Li #define M5(x) ((x) || (x))
32*67e74705SXin Li // CHECK-NEXT: File 7, [[@LINE+1]]:15 -> [[@LINE+1]]:26 = #0
33*67e74705SXin Li #define M6(x) ((x) + (x))
34*67e74705SXin Li // CHECK-NEXT: File 8, [[@LINE+1]]:15 -> [[@LINE+1]]:18 = #0
35*67e74705SXin Li #define M7(x) (x)
36*67e74705SXin Li 
37*67e74705SXin Li // Check for the expansion of M2 within M3.
38*67e74705SXin Li // CHECK-NEXT: File 9, {{[0-9]+}}:15 -> {{[0-9]+}}:41 = (#0 + #8)
39*67e74705SXin Li // CHECK-NEXT: File 9, {{[0-9]+}}:18 -> {{[0-9]+}}:31 = ((#0 + #8) + #9)
40*67e74705SXin Li // CHECK-NEXT: File 9, {{[0-9]+}}:24 -> {{[0-9]+}}:25 = ((#0 + #8) + #9)
41*67e74705SXin Li // CHECK-NEXT: File 9, {{[0-9]+}}:27 -> {{[0-9]+}}:29 = #10
42*67e74705SXin Li // CHECK-NEXT: File 9, {{[0-9]+}}:39 -> {{[0-9]+}}:40 = ((#0 + #8) + #9)
43*67e74705SXin Li 
func(int x)44*67e74705SXin Li void func(int x) {
45*67e74705SXin Li   if (x) {}
46*67e74705SXin Li   M1;
47*67e74705SXin Li   M2(!x);
48*67e74705SXin Li   M2(x);
49*67e74705SXin Li   M3(x);
50*67e74705SXin Li   if (M4(x)) {}
51*67e74705SXin Li   if (M5(x)) {}
52*67e74705SXin Li   if (M6(x)) {}
53*67e74705SXin Li   if (M7(x)) {}
54*67e74705SXin Li }
55*67e74705SXin Li 
main(int argc,const char * argv[])56*67e74705SXin Li int main(int argc, const char *argv[]) {
57*67e74705SXin Li   func(0);
58*67e74705SXin Li }
59