/* 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" } */
}
