// Test visualization of general branch constructs in C.
void simple_loops() {
int i;
for (i = 0; i < 100; ++i) {
}
while (i > 0)
i--;
do {} while (i++ < 75);
}
void conditionals() {
for (int i = 0; i < 100; ++i) {
if (i % 2) {
if (i) {}
} else if (i % 3) {
if (i) {}
} else {
if (i) {}
}
if (1 && i) {}
if (0 || i) {}
}
}
void early_exits() {
int i = 0;
if (i) {}
while (i < 100) {
i++;
if (i > 50)
break;
if (i % 2)
continue;
}
if (i) {}
do {
if (i > 75)
return;
else
i++;
} while (i < 100);
if (i) {}
}
void jumps() {
int i;
for (i = 0; i < 2; ++i) {
goto outofloop;
// Never reached -> no weights
if (i) {}
}
outofloop:
if (i) {}
goto loop1;
while (i) {
loop1:
if (i) {}
}
goto loop2;
first:
second:
third:
i++;
if (i < 3)
goto loop2;
while (i < 3) {
loop2:
switch (i) {
case 0:
goto first;
case 1:
goto second;
case 2:
goto third;
}
}
for (i = 0; i < 10; ++i) {
goto withinloop;
// never reached -> no weights
if (i) {}
withinloop:
if (i) {}
}
}
void switches() {
static int weights[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5};
// No cases -> no weights
switch (weights[0]) {
default:
break;
}
for (int i = 0, len = sizeof(weights) / sizeof(weights[0]); i < len; ++i) {
switch (i[weights]) {
case 1:
if (i) {}
// fallthrough
case 2:
if (i) {}
break;
case 3:
if (i) {}
continue;
case 4:
if (i) {}
switch (i) {
case 6 ... 9:
if (i) {}
continue;
}
default:
if (i == len - 1)
return;
}
}
// Never reached -> no weights
if (weights[0]) {}
}
void big_switch() {
for (int i = 0; i < 32; ++i) {
switch (1 << i) {
case (1 << 0):
if (i) {}
// fallthrough
case (1 << 1):
if (i) {}
break;
case (1 << 2) ... (1 << 12):
if (i) {}
break;
// The branch for the large case range above appears after the case body.
case (1 << 13):
if (i) {}
break;
case (1 << 14) ... (1 << 28):
if (i) {}
break;
// The branch for the large case range above appears after the case body.
case (1 << 29) ... ((1 << 29) + 1):
if (i) {}
break;
default:
if (i) {}
break;
}
}
}
void boolean_operators() {
int v;
for (int i = 0; i < 100; ++i) {
v = i % 3 || i;
v = i % 3 && i;
v = i % 3 || i % 2 || i;
v = i % 2 && i % 3 && i;
}
}
void boolop_loops() {
int i = 100;
while (i && i > 50)
i--;
while ((i % 2) || (i > 0))
i--;
for (i = 100; i && i > 50; --i);
for (; (i % 2) || (i > 0); --i);
}
void conditional_operator() {
int i = 100;
int j = i < 50 ? i : 1;
int k = i ?: 0;
}
void do_fallthrough() {
for (int i = 0; i < 10; ++i) {
int j = 0;
do {
// The number of exits out of this do-loop via the break statement
// exceeds the counter value for the loop (which does not include the
// fallthrough count). Make sure that does not violate any assertions.
if (i < 8) break;
j++;
} while (j < 2);
}
}
static void static_func() {
for (int i = 0; i < 10; ++i) {
}
}
int main(int argc, const char *argv[]) {
simple_loops();
conditionals();
early_exits();
jumps();
switches();
big_switch();
boolean_operators();
boolop_loops();
conditional_operator();
do_fallthrough();
static_func();
extern void __llvm_profile_write_file();
__llvm_profile_write_file();
return 0;
}