// { dg-do compile { target c++11 } }

void
foo ()
{

  [[omp::directive (parallel sections)]]
  {
    [[omp::directive (parallel)]];
    [[omp::sequence (directive (section), directive (flush))]];		// { dg-error "must be the only specified attribute on a statement" }
									// { dg-error "#pragma omp section" "" { target *-*-* } .-1 }
									// { dg-error "#pragma omp flush" "" { target *-*-* } .-2 }
    [[omp::sequence (directive (flush), omp::directive (section))]];	// { dg-error "must be the only specified attribute on a statement" }
									// { dg-error "#pragma omp flush" "" { target *-*-* } .-1 }
    [[gnu::cold, omp::directive (section)]];				// { dg-error "must be the only specified attribute on a statement" }
									// { dg-error "#pragma omp section" "" { target *-*-* } .-1 }
    [[omp::directive (section)]] [[gnu::cold]];				// { dg-error "must be the only specified attribute on a statement" }
									// { dg-error "#pragma omp section" "" { target *-*-* } .-1 }
    [[omp::directive (section foo)]];					// { dg-error "expected end of line before 'foo'" }
  }
}

int
bar (int a, int *c, int *d, int *e, int *f)
{
  int i;
  [[omp::directive (parallel for reduction (inscan, +: a))]]				// { dg-error "'a' specified in 'inscan' 'reduction' clause but not in 'scan' directive clause" }
  for (i = 0; i < 64; i++)
    {
      d[i] = a;
      [[omp::sequence (omp::directive (parallel), omp::directive (scan, exclusive (a)))]]	// { dg-error "must be the only specified attribute on a statement" }
											// { dg-error "#pragma omp scan" "" { target *-*-* } .-1 }
      a += c[i];									// { dg-error "expected" }
    }											// { dg-error "expected" }
  [[omp::directive (parallel for reduction (inscan, +: a))]]				// { dg-error "'a' specified in 'inscan' 'reduction' clause but not in 'scan' directive clause" }
  for (i = 0; i < 64; i++)
    {
      a += c[i];
      [[omp::sequence (directive (scan inclusive (a)), directive (critical))]]		// { dg-error "must be the only specified attribute on a statement" }
											// { dg-error "#pragma omp scan" "" { target *-*-* } .-1 }
      d[i] = a;										// { dg-error "expected" }
    }											// { dg-error "expected" }
  [[omp::directive (parallel for reduction (inscan, +: a))]]				// { dg-error "'a' specified in 'inscan' 'reduction' clause but not in 'scan' directive clause" }
  for (i = 0; i < 64; i++)
    {
      d[i] = a;
      [[gnu::cold]] [[omp::directive (scan, exclusive (a))]]				// { dg-error "must be the only specified attribute on a statement" }
											// { dg-error "#pragma omp scan" "" { target *-*-* } .-1 }
      a += c[i];									// { dg-error "expected" }
    }											// { dg-error "expected" }
  [[omp::directive (parallel for reduction (inscan, +: a))]]				// { dg-error "'a' specified in 'inscan' 'reduction' clause but not in 'scan' directive clause" }
  for (i = 0; i < 64; i++)
    {
      d[i] = a;
      [[omp::directive (scan, exclusive (a)), gnu::cold]]				// { dg-error "must be the only specified attribute on a statement" }
											// { dg-error "#pragma omp scan" "" { target *-*-* } .-1 }
      a += c[i];									// { dg-error "expected" }
    }											// { dg-error "expected" }
  [[omp::directive (parallel for reduction (inscan, +: a))]]				// { dg-error "'a' specified in 'inscan' 'reduction' clause but not in 'scan' directive clause" }
  for (i = 0; i < 64; i++)
    {
      d[i] = a;
      [[omp::directive (scan)]]								// { dg-error "expected 'inclusive' or 'exclusive' clause before end of line" }
      a += c[i];
    }
  return a;
}
