// { dg-do compile { target c++11 } }
void
foo ()
{
  int a[10] = {};
  #pragma omp parallel sections
  {
    #pragma omp section
    a[0]++;
    [[omp::directive (section)]] {
    a[1]++;
    } [[omp::directive (section)]]
    a[2]++;
    #pragma omp section
    { a[3]++; }
  }
  [[omp::directive (parallel sections)]]
  {
    #pragma omp section
    a[0]++;
    [[omp::directive (section)]] {
    a[1]++;
    } [[omp::directive (section)]]
    a[2]++;
    #pragma omp section
    { a[3]++; }
  }
  #pragma omp parallel sections
  {
    #pragma omp section
    a[0]++;
    a[4]++;
    l1: a[5]++;
    if (a[5] == 42) goto l1;
    [[omp::directive (section)]] {
    a[1]++;
    a[6]++;
    } [[omp::directive (section)]]
    a[2]++;
    a[7]++;
    #pragma omp section
    { a[3]++; }
    a[8]++;
  }
  [[omp::directive (parallel sections)]]
  {
    #pragma omp section
    a[0]++;
    a[4]++;
    [[omp::directive (section)]] {
    a[1]++;
    a[5]++;
    } [[omp::directive (section)]]
    a[2]++;
    l2: a[6]++;
    if (a[6] == 42)
      goto l2;
    a[7]++;
    #pragma omp section
    a[8]++;
    { a[3]++; }
  }
}
int
bar (int a, int *c, int *d, int *e, int *f)
{
  int i;
  #pragma omp simd reduction (inscan, +: a)
  for (i = 0; i < 64; i++)
    {
      d[i] = a;
      [[omp::directive (scan, exclusive (a))]]
      a += c[i];
    }
  [[omp::directive (simd reduction (inscan, +: a))]]
  for (i = 0; i < 64; i++)
    {
      a += c[i];
      #pragma omp scan inclusive (a)
      d[i] = a;
    }
  #pragma omp simd reduction (inscan, +: a)
  for (i = 0; i < 64; i++)
    {
      int t = a;
      d[i] = t;
      [[omp::directive (scan, exclusive (a))]]
      int u = c[i];
      a += u;
    }
  [[omp::directive (simd reduction (inscan, +: a))]]
  for (i = 0; i < 64; i++)
    {
      int t = c[i];
      a += t;
      #pragma omp scan inclusive (a)
      int u = a;
      d[i] = u;
    }
  return a;
}