1 /* Portable assumptions */
2 /* { dg-do compile } */
3 /* { dg-options "-std=c2x" } */
4
5 void
6 foo (int x)
7 {
8 if (x == 1)
9 goto l1; /* { dg-error "jump into statement expression" } */
10 else if (x == 2)
11 goto l2; /* { dg-error "jump into statement expression" } */
12 else if (x == 3)
13 goto l3; /* { dg-error "jump into statement expression" } */
14 [[gnu::assume (({ l0:; if (x == 0) goto l0; 1; }))]];
15 [[gnu::assume (({ if (x == 0) __builtin_abort (); 1; }))]];
16 [[gnu::assume (({ l1:; 1; }))]]; /* { dg-message "label 'l1' defined here" } */
17 [[gnu::assume (({ l2:; 1; }))]]; /* { dg-message "label 'l2' defined here" } */
18 __attribute__((assume (({ l3:; 1; })))); /* { dg-message "label 'l3' defined here" } */
19 [[gnu::assume (({ l4:; 1; }))]]; /* { dg-message "label 'l4' defined here" } */
20 [[gnu::assume (({ l5:; 1; }))]]; /* { dg-message "label 'l5' defined here" } */
21 __attribute__((assume (({ l6:; 1; })))); /* { dg-message "label 'l6' defined here" } */
22 switch (x) /* { dg-message "switch starts here" } */
23 {
24 case 7:
25 [[gnu::assume (({ case 8:; 1; }))]]; /* { dg-error "switch jumps into statement expression" } */
26 __attribute__((assume (({ default:; 1; })))); /* { dg-error "switch jumps into statement expression" } */
27 break;
28 }
29 if (x == 4)
30 goto l4; /* { dg-error "jump into statement expression" } */
31 else if (x == 5)
32 goto l5; /* { dg-error "jump into statement expression" } */
33 else if (x == 6)
34 goto l6; /* { dg-error "jump into statement expression" } */
35 }