aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/gnu99-named-loops-3.c
blob: ee944736c7a6e3384f7b854814310ab0df525296 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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;
	    }
	}
    }
}