| /* Portable assumptions */ |
| /* { dg-do compile } */ |
| /* { dg-options "-std=c2x" } */ |
| |
| void |
| foo (int x) |
| { |
| if (x == 1) |
| goto l1; /* { dg-error "jump into statement expression" } */ |
| else if (x == 2) |
| goto l2; /* { dg-error "jump into statement expression" } */ |
| else if (x == 3) |
| goto l3; /* { dg-error "jump into statement expression" } */ |
| [[gnu::assume (({ l0:; if (x == 0) goto l0; 1; }))]]; |
| [[gnu::assume (({ if (x == 0) __builtin_abort (); 1; }))]]; |
| [[gnu::assume (({ l1:; 1; }))]]; /* { dg-message "label 'l1' defined here" } */ |
| [[gnu::assume (({ l2:; 1; }))]]; /* { dg-message "label 'l2' defined here" } */ |
| __attribute__((assume (({ l3:; 1; })))); /* { dg-message "label 'l3' defined here" } */ |
| [[gnu::assume (({ l4:; 1; }))]]; /* { dg-message "label 'l4' defined here" } */ |
| [[gnu::assume (({ l5:; 1; }))]]; /* { dg-message "label 'l5' defined here" } */ |
| __attribute__((assume (({ l6:; 1; })))); /* { dg-message "label 'l6' defined here" } */ |
| switch (x) /* { dg-message "switch starts here" } */ |
| { |
| case 7: |
| [[gnu::assume (({ case 8:; 1; }))]]; /* { dg-error "switch jumps into statement expression" } */ |
| __attribute__((assume (({ default:; 1; })))); /* { dg-error "switch jumps into statement expression" } */ |
| break; |
| } |
| if (x == 4) |
| goto l4; /* { dg-error "jump into statement expression" } */ |
| else if (x == 5) |
| goto l5; /* { dg-error "jump into statement expression" } */ |
| else if (x == 6) |
| goto l6; /* { dg-error "jump into statement expression" } */ |
| } |