diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/gnu99-named-loops-3.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/gnu99-named-loops-3.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/gnu99-named-loops-3.c b/gcc/testsuite/gcc.dg/gnu99-named-loops-3.c new file mode 100644 index 0000000..ee94473 --- /dev/null +++ b/gcc/testsuite/gcc.dg/gnu99-named-loops-3.c @@ -0,0 +1,117 @@ +/* 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; + } + } + } +} |