Hi!

On Mon, 01 Aug 2016 17:21:37 +0200, I wrote:
> Some checking of OpenACC clauses currently done in the front ends should
> be moved later, and be unified.  (Also, I suppose, for supporting of the
> device_type clause, such checking actually *must* be moved later, into
> the oaccdevlow pass, or similar.)  Here is a first preparatory patch.  OK
> for trunk?

In r239520 committed to gomp-4_0-branch:

commit 57c46e92eb368443dbe6c28115f3aeff94fae0dc
Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Wed Aug 17 00:54:50 2016 +0000

    Use verify_oacc_routine_clauses for C/C++
    
        gcc/
        * omp-low.c (build_oacc_routine_dims): Move some of its processing
        into...
        (verify_oacc_routine_clauses): ... this new function.
        * omp-low.h (verify_oacc_routine_clauses): New prototype.
        gcc/c/
        * c-parser.c (c_parser_oacc_routine): Normalize order of clauses.
        (c_finish_oacc_routine): Call verify_oacc_routine_clauses.
        gcc/cp/
        * parser.c (cp_parser_oacc_routine)
        (cp_parser_late_parsing_oacc_routine): Normalize order of clauses.
        (cp_finalize_oacc_routine): Call verify_oacc_routine_clauses.
        gcc/testsuite/
        * c-c++-common/goacc/routine-2.c: Update, and move some test
        into...
        * c-c++-common/goacc/routine-level-of-parallelism-1.c: ... this
        new file.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@239520 
138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog.gomp                                 |   7 +
 gcc/c/ChangeLog.gomp                               |   3 +
 gcc/c/c-parser.c                                   |   8 +
 gcc/cp/ChangeLog.gomp                              |   4 +
 gcc/cp/parser.c                                    |  43 ++--
 gcc/omp-low.c                                      |  67 +++++-
 gcc/omp-low.h                                      |   1 +
 gcc/testsuite/ChangeLog.gomp                       |   7 +
 gcc/testsuite/c-c++-common/goacc/routine-2.c       |  14 +-
 .../goacc/routine-level-of-parallelism-1.c         | 265 +++++++++++++++++++++
 10 files changed, 379 insertions(+), 40 deletions(-)

diff --git gcc/ChangeLog.gomp gcc/ChangeLog.gomp
index f9564d6..bcd011d 100644
--- gcc/ChangeLog.gomp
+++ gcc/ChangeLog.gomp
@@ -1,3 +1,10 @@
+2016-08-17  Thomas Schwinge  <tho...@codesourcery.com>
+
+       * omp-low.c (build_oacc_routine_dims): Move some of its processing
+       into...
+       (verify_oacc_routine_clauses): ... this new function.
+       * omp-low.h (verify_oacc_routine_clauses): New prototype.
+
 2016-08-15  Chung-Lin Tang  <clt...@codesourcery.com>
 
        * omp-low.c (lower_oacc_reductions): Adjust variable lookup to use
diff --git gcc/c/ChangeLog.gomp gcc/c/ChangeLog.gomp
index d9725b0..37f5602 100644
--- gcc/c/ChangeLog.gomp
+++ gcc/c/ChangeLog.gomp
@@ -1,5 +1,8 @@
 2016-08-17  Thomas Schwinge  <tho...@codesourcery.com>
 
+       * c-parser.c (c_parser_oacc_routine): Normalize order of clauses.
+       (c_finish_oacc_routine): Call verify_oacc_routine_clauses.
+
        * c-parser.c (c_parser_oacc_shape_clause)
        (c_parser_oacc_simple_clause): Add loc formal parameter.  Adjust
        all users.
diff --git gcc/c/c-parser.c gcc/c/c-parser.c
index 2e38807..3d50676 100644
--- gcc/c/c-parser.c
+++ gcc/c/c-parser.c
@@ -14205,6 +14205,9 @@ c_parser_oacc_routine (c_parser *parser, enum 
pragma_context context)
       data.clauses
        = c_parser_oacc_all_clauses (parser, OACC_ROUTINE_CLAUSE_MASK,
                                     "#pragma acc routine");
+      /* The clauses are in reverse order; fix that to make later diagnostic
+        emission easier.  */
+      data.clauses = nreverse (data.clauses);
 
       if (TREE_CODE (decl) != FUNCTION_DECL)
        {
@@ -14220,6 +14223,9 @@ c_parser_oacc_routine (c_parser *parser, enum 
pragma_context context)
        = c_parser_oacc_all_clauses (parser, OACC_ROUTINE_CLAUSE_MASK,
                                     "#pragma acc routine",
                                     OACC_ROUTINE_CLAUSE_DEVICE_TYPE_MASK);
+      /* The clauses are in reverse order; fix that to make later diagnostic
+        emission easier.  */
+      data.clauses = nreverse (data.clauses);
 
       /* Emit a helpful diagnostic if there's another pragma following this
         one.  Also don't allow a static assertion declaration, as in the
@@ -14283,6 +14289,8 @@ c_finish_oacc_routine (struct oacc_routine_data *data, 
tree fndecl,
       return;
     }
 
+  verify_oacc_routine_clauses (&data->clauses, data->loc);
+
   if (get_oacc_fn_attrib (fndecl))
     {
       error_at (data->loc,
diff --git gcc/cp/ChangeLog.gomp gcc/cp/ChangeLog.gomp
index feb186a..7f634d9 100644
--- gcc/cp/ChangeLog.gomp
+++ gcc/cp/ChangeLog.gomp
@@ -1,5 +1,9 @@
 2016-08-17  Thomas Schwinge  <tho...@codesourcery.com>
 
+       * parser.c (cp_parser_oacc_routine)
+       (cp_parser_late_parsing_oacc_routine): Normalize order of clauses.
+       (cp_finalize_oacc_routine): Call verify_oacc_routine_clauses.
+
        * parser.c (cp_parser_oacc_shape_clause): Add loc formal
        parameter.  Adjust all users.
 
diff --git gcc/cp/parser.c gcc/cp/parser.c
index d3d673b..8558a6f 100644
--- gcc/cp/parser.c
+++ gcc/cp/parser.c
@@ -36680,6 +36680,9 @@ cp_parser_oacc_routine (cp_parser *parser, cp_token 
*pragma_tok,
        = cp_parser_oacc_all_clauses (parser, OACC_ROUTINE_CLAUSE_MASK,
                                      "#pragma acc routine",
                                      cp_lexer_peek_token (parser->lexer));
+      /* The clauses are in reverse order; fix that to make later diagnostic
+        emission easier.  */
+      data.clauses = nreverse (data.clauses);
 
       if (decl && is_overloaded_fn (decl)
          && (TREE_CODE (decl) != FUNCTION_DECL
@@ -36767,6 +36770,9 @@ cp_parser_late_parsing_oacc_routine (cp_parser *parser, 
tree attrs)
     = cp_parser_oacc_all_clauses (parser, OACC_ROUTINE_CLAUSE_MASK,
                                  "#pragma acc routine", pragma_tok,
                                   OACC_ROUTINE_CLAUSE_DEVICE_TYPE_MASK);
+  /* The clauses are in reverse order; fix that to make later diagnostic
+     emission easier.  */
+  parser->oacc_routine->clauses = nreverse (parser->oacc_routine->clauses);
   cp_parser_pop_lexer (parser);
   /* Later, cp_finalize_oacc_routine will process the clauses, and then set
      fndecl_seen.  */
@@ -36801,23 +36807,6 @@ cp_finalize_oacc_routine (cp_parser *parser, tree 
fndecl, bool is_defn)
          return;
        }
 
-      if (get_oacc_fn_attrib (fndecl))
-       {
-         error_at (parser->oacc_routine->loc,
-                   "%<#pragma acc routine%> already applied to %qD", fndecl);
-         parser->oacc_routine = NULL;
-         return;
-       }
-
-      if (TREE_USED (fndecl) || (!is_defn && DECL_SAVED_TREE (fndecl)))
-       {
-         error_at (parser->oacc_routine->loc,
-                   "%<#pragma acc routine%> must be applied before %s",
-                   TREE_USED (fndecl) ? "use" : "definition");
-         parser->oacc_routine = NULL;
-         return;
-       }
-
       /* Process the bind clause, if present.  */
       for (tree c = parser->oacc_routine->clauses; c; c = OMP_CLAUSE_CHAIN (c))
        {
@@ -36847,6 +36836,26 @@ cp_finalize_oacc_routine (cp_parser *parser, tree 
fndecl, bool is_defn)
          break;
        }
 
+      verify_oacc_routine_clauses (&parser->oacc_routine->clauses,
+                                  parser->oacc_routine->loc);
+
+      if (get_oacc_fn_attrib (fndecl))
+       {
+         error_at (parser->oacc_routine->loc,
+                   "%<#pragma acc routine%> already applied to %qD", fndecl);
+         parser->oacc_routine = NULL;
+         return;
+       }
+
+      if (TREE_USED (fndecl) || (!is_defn && DECL_SAVED_TREE (fndecl)))
+       {
+         error_at (parser->oacc_routine->loc,
+                   "%<#pragma acc routine%> must be applied before %s",
+                   TREE_USED (fndecl) ? "use" : "definition");
+         parser->oacc_routine = NULL;
+         return;
+       }
+
       /* Process the routine's dimension clauses.  */
       tree dims = build_oacc_routine_dims (parser->oacc_routine->clauses);
       replace_oacc_fn_attrib (fndecl, dims);
diff --git gcc/omp-low.c gcc/omp-low.c
index 2e725d6..6604897 100644
--- gcc/omp-low.c
+++ gcc/omp-low.c
@@ -12699,9 +12699,62 @@ set_oacc_fn_attrib (tree fn, tree clauses, bool 
is_kernel, vec<tree> *args)
     }
 }
 
-/*  Process the routine's dimension clauess to generate an attribute
-    value.  Issue diagnostics as appropriate.  We default to SEQ
-    (OpenACC 2.5 clarifies this). All dimensions have a size of zero
+/* Verify OpenACC routine clauses.
+
+   The chain of clauses returned will contain exactly one clause specifying the
+   level of parallelism.  */
+
+void
+verify_oacc_routine_clauses (tree *clauses, location_t loc)
+{
+  tree c_level = NULL_TREE;
+  tree c_p = NULL_TREE;
+  for (tree c = *clauses; c; c_p = c, c = OMP_CLAUSE_CHAIN (c))
+    switch (OMP_CLAUSE_CODE (c))
+      {
+      case OMP_CLAUSE_GANG:
+      case OMP_CLAUSE_WORKER:
+      case OMP_CLAUSE_VECTOR:
+      case OMP_CLAUSE_SEQ:
+       if (c_level == NULL_TREE)
+         c_level = c;
+       else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_CODE (c_level))
+         {
+           /* This has already been diagnosed in the front ends.  */
+           /* Drop the duplicate clause.  */
+           gcc_checking_assert (c_p != NULL_TREE);
+           OMP_CLAUSE_CHAIN (c_p) = OMP_CLAUSE_CHAIN (c);
+           c = c_p;
+         }
+       else
+         {
+           error_at (OMP_CLAUSE_LOCATION (c),
+                     "%qs specifies a conflicting level of parallelism",
+                     omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+           inform (OMP_CLAUSE_LOCATION (c_level),
+                   "... to the previous %qs clause here",
+                   omp_clause_code_name[OMP_CLAUSE_CODE (c_level)]);
+           /* Drop the conflicting clause.  */
+           gcc_checking_assert (c_p != NULL_TREE);
+           OMP_CLAUSE_CHAIN (c_p) = OMP_CLAUSE_CHAIN (c);
+           c = c_p;
+         }
+       break;
+      default:
+       gcc_unreachable ();
+      }
+  if (c_level == NULL_TREE)
+    {
+      /* OpenACC 2.5 makes this an error; for the current OpenACC 2.0a
+        implementation add an implicit "seq" clause.  */
+      c_level = build_omp_clause (loc, OMP_CLAUSE_SEQ);
+      OMP_CLAUSE_CHAIN (c_level) = *clauses;
+      *clauses = c_level;
+    }
+}
+
+/*  Process the OpenACC routine's clauses to generate an attribute
+    for the level of parallelism.  All dimensions have a size of zero
     (dynamic).  TREE_PURPOSE is set to indicate whether that dimension
     can have a loop partitioned on it.  non-zero indicates
     yes, zero indicates no.  By construction once a non-zero has been
@@ -12723,17 +12776,11 @@ build_oacc_routine_dims (tree clauses)
     for (ix = GOMP_DIM_MAX + 1; ix--;)
       if (OMP_CLAUSE_CODE (clauses) == ids[ix])
        {
-         if (level >= 0)
-           error_at (OMP_CLAUSE_LOCATION (clauses),
-                     "multiple loop axes specified for routine");
          level = ix;
          break;
        }
+  gcc_checking_assert (level >= 0);
 
-  /* Default to SEQ.  */
-  if (level < 0)
-    level = GOMP_DIM_MAX;
-  
   tree dims = NULL_TREE;
 
   for (ix = GOMP_DIM_MAX; ix--;)
diff --git gcc/omp-low.h gcc/omp-low.h
index b1f7885..c7b7dcb 100644
--- gcc/omp-low.h
+++ gcc/omp-low.h
@@ -31,6 +31,7 @@ extern bool make_gimple_omp_edges (basic_block, struct 
omp_region **, int *);
 extern void omp_finish_file (void);
 extern tree omp_member_access_dummy_var (tree);
 extern void replace_oacc_fn_attrib (tree, tree);
+extern void verify_oacc_routine_clauses (tree *, location_t);
 extern tree build_oacc_routine_dims (tree);
 extern tree get_oacc_fn_attrib (tree);
 extern void set_oacc_fn_attrib (tree, tree, bool, vec<tree> *);
diff --git gcc/testsuite/ChangeLog.gomp gcc/testsuite/ChangeLog.gomp
index efaa360..0870821 100644
--- gcc/testsuite/ChangeLog.gomp
+++ gcc/testsuite/ChangeLog.gomp
@@ -1,3 +1,10 @@
+2016-08-17  Thomas Schwinge  <tho...@codesourcery.com>
+
+       * c-c++-common/goacc/routine-2.c: Update, and move some test
+       into...
+       * c-c++-common/goacc/routine-level-of-parallelism-1.c: ... this
+       new file.
+
 2016-08-16  Cesar Philippidis  <ce...@codesourcery.com>
            Thomas Schwinge  <tho...@codesourcery.com>
 
diff --git gcc/testsuite/c-c++-common/goacc/routine-2.c 
gcc/testsuite/c-c++-common/goacc/routine-2.c
index 35857ea..7582c86 100644
--- gcc/testsuite/c-c++-common/goacc/routine-2.c
+++ gcc/testsuite/c-c++-common/goacc/routine-2.c
@@ -1,16 +1,4 @@
-/* Test invalid use of clauses with routine.  */
-
-#pragma acc routine gang worker /* { dg-error "multiple loop axes" } */
-extern void gang (void);
-
-#pragma acc routine worker vector /* { dg-error "multiple loop axes" } */
-extern void worker (void);
-
-#pragma acc routine vector seq /* { dg-error "multiple loop axes" } */
-extern void vector (void);
-
-#pragma acc routine seq gang /* { dg-error "multiple loop axes" } */
-extern void seq (void);
+/* Test invalid use of clauses with OpenACC routine.  */
 
 extern float F;
 #pragma acc routine bind (F) /* { dg-error ".F. does not refer to a function" 
} */
diff --git gcc/testsuite/c-c++-common/goacc/routine-level-of-parallelism-1.c 
gcc/testsuite/c-c++-common/goacc/routine-level-of-parallelism-1.c
new file mode 100644
index 0000000..fc8bc3c
--- /dev/null
+++ gcc/testsuite/c-c++-common/goacc/routine-level-of-parallelism-1.c
@@ -0,0 +1,265 @@
+/* Test various aspects of clauses specifying incompatible levels of
+   parallelism with the OpenACC routine directive.  The Fortran counterpart is
+   ../../gfortran.dg/goacc/routine-level-of-parallelism-1.f.  */
+
+extern void g_1 (void);
+#pragma acc routine (g_1) gang gang /* { dg-error "too many 'gang' clauses" } 
*/
+
+#pragma acc routine worker worker /* { dg-error "too many 'worker' clauses" } 
*/
+void w_1 (void)
+{
+}
+
+#pragma acc routine vector vector /* { dg-error "too many 'vector' clauses" } 
*/
+void v_1 (void)
+{
+}
+
+#pragma acc routine seq seq /* { dg-error "too many 'seq' clauses" } */
+extern void s_1 (void);
+
+
+#pragma acc routine gang gang gang /* { dg-error "too many 'gang' clauses" } */
+void g_2 (void)
+{
+}
+
+#pragma acc routine worker worker worker /* { dg-error "too many 'worker' 
clauses" } */
+extern void w_2 (void);
+
+extern void v_2 (void);
+#pragma acc routine (v_2) vector vector vector /* { dg-error "too many 
'vector' clauses" } */
+
+#pragma acc routine seq seq seq /* { dg-error "too many 'seq' clauses" } */
+void s_2 (void)
+{
+}
+
+
+#pragma acc routine \
+  gang \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */
+void g_3 (void)
+{
+}
+#pragma acc routine (g_3) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*g_3." } */ \
+  gang \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */
+#pragma acc routine (g_3) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*g_3." } */ \
+  gang \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */
+
+extern void w_3 (void);
+#pragma acc routine (w_3) \
+  worker \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */
+#pragma acc routine (w_3) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*w_3." } */ \
+  worker \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
+#pragma acc routine (w_3) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*w_3." } */ \
+  worker \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */
+
+#pragma acc routine \
+  vector \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */
+void v_3 (void)
+{
+}
+#pragma acc routine (v_3) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*v_3." } */ \
+  vector \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */
+#pragma acc routine (v_3) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*v_3." } */ \
+  vector \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
+
+extern void s_3 (void);
+#pragma acc routine (s_3) \
+  seq \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
+#pragma acc routine (s_3) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*s_3." } */ \
+  seq \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */
+#pragma acc routine (s_3) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*s_3." } */ \
+  seq \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */
+
+
+#pragma acc routine \
+  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */ \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */ \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */
+extern void g_4 (void);
+#pragma acc routine (g_4) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*g_4." } */ \
+  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */ \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */ \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */
+#pragma acc routine (g_4) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*g_4." } */ \
+  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */ \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */
+
+extern void w_4 (void);
+#pragma acc routine (w_4) \
+  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */ \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
+#pragma acc routine (w_4) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*w_4." } */ \
+  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */ \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
+#pragma acc routine (w_4) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*w_4." } */ \
+  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } 
*/ \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */
+
+#pragma acc routine \
+  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */ \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
+void v_4 (void)
+{
+}
+#pragma acc routine (v_4) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*v_4." } */ \
+  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */ \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
+#pragma acc routine (v_4) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*v_4." } */ \
+  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } 
*/ \
+  seq /* { dg-error ".seq. specifies a conflicting level of parallelism" } */ \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */
+
+#pragma acc routine \
+  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */ \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */ \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
+void s_4 (void)
+{
+}
+#pragma acc routine (s_4) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*s_4." } */ \
+  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */ \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } 
*/ \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */
+#pragma acc routine (s_4) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*s_4." } */ \
+  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  worker /* { dg-error ".worker. specifies a conflicting level of parallelism" 
} */ \
+  vector /* { dg-error ".vector. specifies a conflicting level of parallelism" 
} */ \
+  gang /* { dg-error ".gang. specifies a conflicting level of parallelism" } */
+
+
+#pragma acc routine \
+  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { 
target *-*-* } 163 } */ \
+  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { 
target *-*-* } 165 } */ \
+  seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { 
target *-*-* } 167 } */
+void g_5 (void)
+{
+}
+#pragma acc routine (g_5) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*g_5." } */ \
+  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { 
target *-*-* } 174 } */ \
+  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { 
target *-*-* } 176 } */ \
+  seq seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { 
target *-*-* } 178 } */
+#pragma acc routine (g_5) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*g_5." } */ \
+  gang gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { 
target *-*-* } 182 } */ \
+  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { 
target *-*-* } 184 } */ \
+  worker worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { 
target *-*-* } 186 } */
+
+#pragma acc routine \
+  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { 
target *-*-* } 191 } */ \
+  vector vector vector vector vector /* { dg-error "too many 'vector' clauses" 
} */ \
+  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { 
target *-*-* } 193 } */ \
+  gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { 
target *-*-* } 195 } */
+extern void w_5 (void);
+#pragma acc routine (w_5) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*w_5." } */ \
+  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { 
target *-*-* } 200 } */ \
+  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { 
target *-*-* } 202 } */ \
+  gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { 
target *-*-* } 204 } */
+#pragma acc routine (w_5) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*w_5." } */ \
+  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { 
target *-*-* } 208 } */ \
+  gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { 
target *-*-* } 210 } */ \
+  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { 
target *-*-* } 212 } */
+
+#pragma acc routine \
+  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { 
target *-*-* } 217 } */ \
+  seq seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { 
target *-*-* } 219 } */ \
+  gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { 
target *-*-* } 221 } */
+extern void v_5 (void);
+#pragma acc routine (v_5) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*v_5." } */ \
+  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  seq seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { 
target *-*-* } 226 } */ \
+  worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { 
target *-*-* } 228 } */ \
+  gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { 
target *-*-* } 230 } */
+#pragma acc routine (v_5) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*v_5." } */ \
+  vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { 
target *-*-* } 234 } */ \
+  seq seq seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  /* { dg-error ".seq. specifies a conflicting level of parallelism" "" { 
target *-*-* } 236 } */ \
+  worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { 
target *-*-* } 238 } */
+
+extern void s_5 (void);
+#pragma acc routine (s_5) \
+  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { 
target *-*-* } 244 } */ \
+  worker worker worker worker worker /* { dg-error "too many 'worker' clauses" 
} */ \
+  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { 
target *-*-* } 246 } */ \
+  gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { 
target *-*-* } 248 } */
+#pragma acc routine (s_5) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*s_5." } */ \
+  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { 
target *-*-* } 252 } */ \
+  gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { 
target *-*-* } 254 } */ \
+  worker worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { 
target *-*-* } 256 } */
+#pragma acc routine (s_5) /* { dg-error ".#pragma acc routine. already applied 
to .\[void \]*s_5." } */ \
+  seq seq seq /* { dg-error "too many 'seq' clauses" } */ \
+  worker worker /* { dg-error "too many 'worker' clauses" } */ \
+  /* { dg-error ".worker. specifies a conflicting level of parallelism" "" { 
target *-*-* } 260 } */ \
+  vector vector vector vector /* { dg-error "too many 'vector' clauses" } */ \
+  /* { dg-error ".vector. specifies a conflicting level of parallelism" "" { 
target *-*-* } 262 } */ \
+  gang gang /* { dg-error "too many 'gang' clauses" } */ \
+  /* { dg-error ".gang. specifies a conflicting level of parallelism" "" { 
target *-*-* } 264 } */


Grüße
 Thomas

Reply via email to