/* N3355 - Named loops. */ /* { dg-do compile } */ /* { dg-options "-std=gnu99" } */ void foo (int x) { for (int i = 0; i < 16; ++i) { int k; label1: /* { dg-message "loop name defined here" } */ for (int j = ({ if (x == 0) break label1; 0; }); j < 16; ++j) /* { dg-error "'break' statement operand 'label1' refers to a loop outside of its body" } */ ; label2: /* { dg-message "loop name defined here" } */ for (int j = ({ if (x == 1) continue label2; 0; }); j < 16; ++j) /* { dg-error "'continue' statement operand 'label2' refers to a loop outside of its body" } */ ; label3: /* { dg-message "loop name defined here" } */ for (int j = 0; j < ({ if (x == 2) break label3; 16; }); ++j) /* { dg-error "'break' statement operand 'label3' refers to a loop outside of its body" } */ ; label4: /* { dg-message "loop name defined here" } */ for (int j = 0; j < ({ if (x == 3) continue label4; 16; }); ++j) /* { dg-error "'continue' statement operand 'label4' refers to a loop outside of its body" } */ ; label5: /* { dg-message "loop name defined here" } */ for (int j = 0; j < 16; j += ({ if (x == 4) break label5; 1; })) /* { dg-error "'break' statement operand 'label5' refers to a loop outside of its body" } */ ; label6: /* { dg-message "loop name defined here" } */ for (int j = 0; j < 16; j += ({ if (x == 5) continue label6; 1; })) /* { dg-error "'continue' statement operand 'label6' refers to a loop outside of its body" } */ ; k = 0; label7: /* { dg-message "loop name defined here" } */ while (k < ({ if (x == 6) break label7; 16; })) /* { dg-error "'break' statement operand 'label7' refers to a loop outside of its body" } */ ++k; k = 0; label8: /* { dg-message "loop name defined here" } */ while (k < ({ if (x == 7) continue label8; 16; })) /* { dg-error "'continue' statement operand 'label8' refers to a loop outside of its body" } */ ++k; k = 0; label9: do ++k; while (k <= ({ if (x == 8) break label9; 16; })); /* { dg-error "'break' statement operand 'label9' does not refer to a named loop or 'switch'" } */ k = 0; label10: do ++k; while (k <= ({ if (x == 9) continue label10; 16; })); /* { dg-error "'continue' statement operand 'label10' does not refer to a named loop" } */ label11: /* { dg-message "'switch' name defined here" } */ switch (x + ({ if (x == 10) break label11; 0; })) /* { dg-error "'break' statement operand 'label11' refers to a 'switch' outside of its body" } */ { case 0: break; } } label12: label13: label14: for (int i = 0; i < 32; ++i) { label15: switch (i) { label16: case 0: label17: label18: label19: label20: label21: label22: label23: label24: label25: label26: label27: label28: label29: label30: for (int j = 0; j < 32; ++j) { if (j == 31) continue label14; else if (j == 30) break label15; void bar (void) { label31: for (int k = 0; k < 32; ++k) if (k == 31) continue label31; else if (k == 30) break label31; else if (k == 29) continue label22; /* { dg-error "'continue' statement operand 'label22' does not refer to a named loop; did you mean 'label31'\\\?" } */ else if (k == 28) break label20; /* { dg-error "'break' statement operand 'label20' does not refer to a named loop or 'switch'; did you mean 'label31'\\\?" } */ else if (k == 27) break label15; /* { dg-error "'break' statement operand 'label15' does not refer to a named loop or 'switch'; did you mean 'label31'\\\?" } */ else if (k == 26) continue label13; /* { dg-error "'continue' statement operand 'label13' does not refer to a named loop; did you mean 'label31'\\\?" } */ else if (k == 25) break label12; /* { dg-error "'break' statement operand 'label12' does not refer to a named loop or 'switch'; did you mean 'label31'\\\?" } */ } bar (); if (j == 29) continue label22; else if (j == 28) break label20; else if (j == 27) break label15; else if (j == 26) continue label13; else if (j == 25) break label12; } } } }