1  /* { dg-do compile } */
       2  /* { dg-options "-fopenmp" } */
       3  
       4  void
       5  foo (void)
       6  {
       7    int i;
       8    #pragma omp for ordered
       9    for (i = 0; i < 64; i++)
      10      {
      11        #pragma omp ordered
      12        ;
      13      }
      14    #pragma omp for ordered
      15    for (i = 0; i < 64; i++)
      16      {
      17        #pragma omp ordered threads
      18        ;
      19      }
      20    #pragma omp for ordered
      21    for (i = 0; i < 64; i++)
      22      {
      23        #pragma omp ordered threads threads	/* { dg-error "too many .threads. clauses" } */
      24        ;
      25      }
      26    #pragma omp simd
      27    for (i = 0; i < 64; i++)
      28      {
      29        #pragma omp ordered simd
      30        ;
      31      }
      32    #pragma omp simd
      33    for (i = 0; i < 64; i++)
      34      {
      35        #pragma omp ordered simd simd		/* { dg-error "too many .simd. clauses" } */
      36        ;
      37      }
      38    #pragma omp for simd ordered
      39    for (i = 0; i < 64; i++)
      40      {
      41        #pragma omp ordered threads, simd
      42        ;
      43      }
      44    #pragma omp for simd ordered
      45    for (i = 0; i < 64; i++)
      46      {
      47        #pragma omp ordered threads, simd, threads, simd	/* { dg-error "too many .threads. clauses" } */
      48        ;	/* { dg-error "too many .simd. clauses" "" { target *-*-* } .-1 } */
      49      }
      50    #pragma omp for simd ordered(1)
      51    for (i = 0; i < 64; i++)
      52      {
      53        #pragma omp ordered depend(sink: i - 1)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      54        #pragma omp ordered depend(source)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      55      }
      56    #pragma omp for simd ordered(1)
      57    for (i = 0; i < 64; i++)
      58      {
      59        #pragma omp ordered doacross(sink: i - 1)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      60        #pragma omp ordered doacross(source:omp_cur_iteration)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      61      }
      62    #pragma omp parallel for simd ordered(1)
      63    for (i = 0; i < 64; i++)
      64      {
      65        #pragma omp ordered depend(sink: i - 1)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      66        #pragma omp ordered depend(source)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      67      }
      68    #pragma omp parallel for simd ordered(1)
      69    for (i = 0; i < 64; i++)
      70      {
      71        #pragma omp ordered doacross(sink: i - 1)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      72        #pragma omp ordered doacross(source:)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      73      }
      74    #pragma omp parallel for ordered
      75    for (i = 0; i < 64; i++)
      76      {
      77        #pragma omp ordered depend(sink: i - 1)
      78        #pragma omp ordered depend(source)
      79      }
      80    #pragma omp parallel for ordered
      81    for (i = 0; i < 64; i++)
      82      {
      83        #pragma omp ordered doacross(sink: i - 1)
      84        #pragma omp ordered doacross(source:)
      85      }
      86    #pragma omp parallel for
      87    for (i = 0; i < 64; i++)
      88      {
      89        #pragma omp ordered depend(sink: i - 1)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      90        #pragma omp ordered depend(source)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      91      }
      92    #pragma omp parallel for
      93    for (i = 0; i < 64; i++)
      94      {
      95        #pragma omp ordered doacross(sink: i - 1)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      96        #pragma omp ordered doacross(source:)	/* { dg-error "clause must be closely nested inside a loop with .ordered. clause" } */
      97      }
      98  }
      99  
     100  void
     101  bar (int x)
     102  {
     103    switch (x)
     104      {
     105      case 0:
     106        #pragma omp ordered
     107        ;
     108        break;
     109      case 1:
     110        #pragma omp ordered threads
     111        ;
     112        break;
     113      case 2:
     114        #pragma omp ordered threads, threads	/* { dg-error "too many .threads. clauses" } */
     115        ;
     116        break;
     117      }
     118  }
     119  
     120  void
     121  baz (void)
     122  {
     123    #pragma omp ordered simd
     124    ;
     125    #pragma omp ordered simd, simd		/* { dg-error "too many .simd. clauses" } */
     126    ;
     127  }