1 1.4 rillig /* $NetBSD: msg_323.c,v 1.4 2021/10/10 09:17:24 rillig Exp $ */ 2 1.1 rillig # 3 "msg_323.c" 3 1.1 rillig 4 1.1 rillig // Test for message: continue in 'do ... while (0)' loop [323] 5 1.4 rillig 6 1.3 rillig void println(const char *); 7 1.1 rillig 8 1.4 rillig /* 9 1.4 rillig * In simple cases of a do-while-0 loop, the statements 'break' and 10 1.4 rillig * 'continue' have the same effect, and 'break' is much more common. 11 1.4 rillig * 12 1.4 rillig * This is also covered by Clang-Tidy. 13 1.4 rillig */ 14 1.4 rillig void 15 1.4 rillig simple_case(const char *p) 16 1.4 rillig { 17 1.4 rillig do { 18 1.4 rillig if (p[0] == '+') 19 1.4 rillig break; 20 1.4 rillig if (p[1] == '-') 21 1.4 rillig continue; 22 1.4 rillig println("no sign"); 23 1.4 rillig /* expect+1: error: continue in 'do ... while (0)' loop [323] */ 24 1.4 rillig } while (0); 25 1.4 rillig } 26 1.4 rillig 27 1.4 rillig /* 28 1.4 rillig * If there is a 'switch' statement inside the do-while-0 loop, the 'break' 29 1.4 rillig * statement is tied to the 'switch' statement instead of the loop. 30 1.4 rillig */ 31 1.3 rillig void 32 1.4 rillig nested_switch(const char *p) 33 1.3 rillig { 34 1.3 rillig do { 35 1.3 rillig switch (*p) { 36 1.3 rillig case 'a': 37 1.3 rillig continue; /* leaves the 'do while 0' */ 38 1.3 rillig case 'b': 39 1.3 rillig break; /* leaves the 'switch' */ 40 1.3 rillig } 41 1.3 rillig println("b"); 42 1.3 rillig /* XXX: Is that really worth an error? */ 43 1.3 rillig /* expect+1: error: continue in 'do ... while (0)' loop [323] */ 44 1.3 rillig } while (0); 45 1.3 rillig } 46 1.4 rillig 47 1.4 rillig /* 48 1.4 rillig * In a nested loop, the 'continue' statement is bound to the inner loop, 49 1.4 rillig * thus no warning. 50 1.4 rillig */ 51 1.4 rillig void 52 1.4 rillig nested_for(void) 53 1.4 rillig { 54 1.4 rillig do { 55 1.4 rillig for (int i = 0; i < 6; i++) { 56 1.4 rillig if (i < 3) 57 1.4 rillig continue; 58 1.4 rillig } 59 1.4 rillig } while (0); 60 1.4 rillig } 61