// control flow int if1(void) { if (1) { return 1; } return 0; } int if2(void) { if (0) { return 0; } return 2; } int if3(void) { if (1) { return 3; } else { return 0; } return 0; } int if4(void) { if (0) { return 0; } else { return 4; } return 0; } int if5(void) { if (1) return 5; return 0; } int if6(void) { if (0) return 0; return 6; } int if7(void) { if (1) return 7; else return 0; return 0; } int if8(void) { if (0) return 0; else return 8; return 0; } int if9(void) { // 0.5 evaluates true if (0.5) return 9; else return 0; } int main(void) { int i; int j; expecti(if1(), 1); expecti(if2(), 2); expecti(if3(), 3); expecti(if4(), 4); expecti(if5(), 5); expecti(if6(), 6); expecti(if7(), 7); expecti(if8(), 8); expecti(if9(), 9); // for control j = 0; for (i = 0; i < 5; i++) j = j + i; expecti(j, 10); j = 0; for (i = 0; i < 5; i++) { j = j + i; } expecti(j, 10); j = 0; for (i = 0; i < 100; i++) { if (i < 5) continue; if (i == 9) break; j += i; } expecti(j, 5 + 6 + 7 + 8); i = 0; for (; 0.5;) { i = 1337; break; } expecti(i, 1337); // while control i = 0; j = 0; while (i <= 100) j = j + i++; expecti(j, 5050); i = 0; j = 1; while (i <= 100) j = j + i++; expecti(j, 5051); i = 0; j = 0; while (i < 10) { if (i++ < 5) continue; j += i; if (i == 9) break; } expecti(j, 6 + 7 + 8 + 9); i = 0; while (0.5) { i = 1337; break; } expecti(i, 1337); // do control i = 0; j = 0; do { j = j + i++; } while (i <= 100); expecti(j, 5050); i = 0; do { i = 1337; } while (0); expecti(i, 1337); i = 0; j = 0; do { if (i++ < 5) continue; j += i; if (i == 9) break; } while (i < 10); expecti(j, 6 + 7 + 8 + 9); expecti(i, 9); i = 0; do { i++; break; } while (0.5); expecti(i, 1); // switch control i = 0; switch (1 + 2) { case 0: expecti(0, 1); case 3: i = 3; break; case 1: expecti(0, 1); } expecti(i, 3); i = 0; switch(1) { case 0: i++; case 1: i++; case 2: i++; case 3: i++; } expecti(i, 3); i = 0; switch (1024) { case 0: i++; default: i = 128; } expecti(i, 128); i = 0; switch (1024) { case 0: i++; } expecti(i, 0); i = 1024; switch (3) { i++; } switch (1337) { case 1 ... 100: expecti(1, 0); case 101: expecti(1, 0); case 102 ... 1337: break; default: expecti(1, 0); } expecti(i, 1024); i = 0; j = 1024; switch (j % 8) { case 0: do { i++; case 7: i++; case 6: i++; case 5: i++; case 4: i++; case 3: i++; case 2: i++; case 1: i++; } while ((j -= 8) > 0); } expecti(i, 1024); // goto control j = 0; goto A; j = 5; A: expecti(j, 0); i = 0; j = 0; B: if (i > 10) goto C; j += i++; goto B; C: if (i > 11) goto D; expecti(j, 55); i++; goto B; D: expecti(i, 12); expecti(j, 55); // logical or control flow expecti(0 || 3, 1); expecti(5 || 0, 1); expecti(0 || 0, 0); // empty expressions for (;;) break; for (i = 0; i < 50; i++) ; i = 0; while (i++ < 50) ; i = 0; do 1; while (i++ < 50); i = 0; do; while (i++ < 50); switch (1) ; i = ((0.5) ? 1 : 0); expecti(i, 1); // computed goto void *Q[] = { &&__a, &&__b, &&__c, &&__d }; int _ = 0; goto *Q[0]; _ = 100; __a: if (_ == 5) return 0; expecti(_, 0); _ = 1; goto *Q[2]; _ = 2; __b: expecti(_, -1); _ = 5; goto *Q[3]; _ = 0; __c: expecti(_, 1); _ = -1; goto *Q[1]; _ = 3; __d: expecti(_, 5); goto **Q; return 1; // error }