// This test checks that the cycle detection algorithm in llvm-cov is able to
// handle complex block graphs by skipping zero count cycles.
//
// RUN: mkdir -p %t.dir && cd %t.dir
// RUN: %clang --coverage %s -o %t -dumpdir ./
// RUN: rm -f gcov-complex-line.gcda && %run %t
// RUN: llvm-cov gcov -t gcov-complex-line.c | FileCheck %s
#define M_0 \
do { \
if (x == 0) \
x = 0; \
else \
x = 1; \
} while (0)
#define M_1 \
do { \
M_0; \
M_0; \
M_0; \
M_0; \
} while (0)
#define M_2 \
do { \
M_1; \
M_1; \
M_1; \
M_1; \
} while (0)
#define M_3 \
do { \
M_2; \
M_2; \
M_2; \
M_2; \
} while (0)
#define M_4 \
do { \
M_3; \
M_3; \
M_3; \
M_3; \
} while (0)
#define COMPLEX_LINE \
do { \
for (int i = 0; i < 100; ++i) \
M_4; \
} while (0)
int main() {
volatile int x = 0;
// In the following line, the number of cycles in the block graph is at least
// 2^256, where 256 is the number of expansions of M_0.
COMPLEX_LINE; // CHECK: 101: [[#@LINE]]: COMPLEX_LINE;
}