Hi!

In gomp-4_0-branch's r208648, I have just committed some ;-) support for
OpenACC num_gangs, num_workers, vector_length clauses (OpenACC parallel
directive), that is, just passing them through the compiler -- now,
libgomp just needs to do something useful with that information.

commit 0104aa41048603ecc0bcfe747b735068557e4431
Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Tue Mar 18 13:09:24 2014 +0000

    OpenACC num_gangs, num_workers, vector_length clauses.
    
        gcc/c-family/
        * c-pragma.h (enum pragma_omp_clause): Add
        PRAGMA_OMP_CLAUSE_NUM_GANGS, PRAGMA_OMP_CLAUSE_NUM_WORKERS,
        PRAGMA_OMP_CLAUSE_VECTOR_LENGTH.
        gcc/c/
        * c-parser.c (c_parser_omp_clause_num_gangs)
        (c_parser_omp_clause_num_workers)
        (c_parser_omp_clause_vector_length): New functions.
        (c_parser_omp_clause_name, c_parser_oacc_all_clauses): Handle
        PRAGMA_OMP_CLAUSE_NUM_GANGS, PRAGMA_OMP_CLAUSE_NUM_WORKERS,
        PRAGMA_OMP_CLAUSE_VECTOR_LENGTH.
        (OACC_PARALLEL_CLAUSE_MARK): Add these.
        * c-typeck.c (c_finish_omp_clauses): Handle these.
    
        gcc/
        * builtin-types.def
        (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT): New type.
        * oacc-builtins.def (BUILT_IN_GOACC_KERNELS)
        (BUILT_IN_GOACC_PARALLEL): Switch to that one.
        * gimplify.c (gimplify_scan_omp_clauses)
        (gimplify_adjust_omp_clauses): Handle OMP_CLAUSE_NUM_GANGS,
        OMP_CLAUSE_NUM_WORKERS, OMP_CLAUSE_VECTOR_LENGTH.
        * omp-low.c (scan_sharing_clauses, expand_oacc_offload): Likewise.
        gcc/ada/
        * gcc-interface/utils.c (DEF_FUNCTION_TYPE_10): Define.
        gcc/c-family/
        * c-common.c (DEF_FUNCTION_TYPE_10): Define.
        gcc/fortran/
        * f95-lang.c (DEF_FUNCTION_TYPE_10): Define.
        * types.def
        (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT): New type.
        gcc/lto/
        * c-common.c (DEF_FUNCTION_TYPE_10): Define.
        libgomp/
        * libgomp_g.h (GOACC_kernels, GOACC_parallel): Add three
        additional int arguments.
        * oacc-parallel.c (GOACC_kernels, GOACC_parallel): Handle these.
        * testsuite/libgomp.oacc-c/goacc_kernels.c: Adjust.
        * testsuite/libgomp.oacc-c/goacc_parallel.c: Likewise.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@208648 
138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog.gomp                                |  11 ++
 gcc/ada/ChangeLog.gomp                            |   6 +-
 gcc/ada/gcc-interface/utils.c                     |   7 +
 gcc/builtin-types.def                             |   4 +
 gcc/c-family/ChangeLog.gomp                       |   8 ++
 gcc/c-family/c-common.c                           |   7 +
 gcc/c-family/c-pragma.h                           |   3 +
 gcc/c/ChangeLog.gomp                              |  11 ++
 gcc/c/c-parser.c                                  | 160 +++++++++++++++++++++-
 gcc/c/c-typeck.c                                  |   3 +
 gcc/fortran/ChangeLog.gomp                        |   8 +-
 gcc/fortran/f95-lang.c                            |  18 +++
 gcc/fortran/types.def                             |   4 +
 gcc/gimplify.c                                    |  12 +-
 gcc/lto/ChangeLog.gomp                            |   6 +-
 gcc/lto/lto-lang.c                                |   7 +
 gcc/oacc-builtins.def                             |   6 +-
 gcc/omp-low.c                                     |  49 +++++--
 libgomp/ChangeLog.gomp                            |   8 ++
 libgomp/libgomp_g.h                               |   6 +-
 libgomp/oacc-parallel.c                           |  19 ++-
 libgomp/testsuite/libgomp.oacc-c/goacc_kernels.c  |   4 +-
 libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c |   4 +-
 23 files changed, 343 insertions(+), 28 deletions(-)

diff --git gcc/ChangeLog.gomp gcc/ChangeLog.gomp
index 9b8aec0..d35cbee 100644
--- gcc/ChangeLog.gomp
+++ gcc/ChangeLog.gomp
@@ -1,3 +1,14 @@
+2014-03-18  Thomas Schwinge  <tho...@codesourcery.com>
+
+       * builtin-types.def
+       (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT): New type.
+       * oacc-builtins.def (BUILT_IN_GOACC_KERNELS)
+       (BUILT_IN_GOACC_PARALLEL): Switch to that one.
+       * gimplify.c (gimplify_scan_omp_clauses)
+       (gimplify_adjust_omp_clauses): Handle OMP_CLAUSE_NUM_GANGS,
+       OMP_CLAUSE_NUM_WORKERS, OMP_CLAUSE_VECTOR_LENGTH.
+       * omp-low.c (scan_sharing_clauses, expand_oacc_offload): Likewise.
+
 2014-03-13  Thomas Schwinge  <tho...@codesourcery.com>
 
        * tree.h (OMP_CLAUSE_VECTOR_EXPR): Check for OMP_CLAUSE_VECTOR
diff --git gcc/ada/ChangeLog.gomp gcc/ada/ChangeLog.gomp
index 0bb4618..eff84ec 100644
--- gcc/ada/ChangeLog.gomp
+++ gcc/ada/ChangeLog.gomp
@@ -1,8 +1,12 @@
+2014-03-18  Thomas Schwinge  <tho...@codesourcery.com>
+
+       * gcc-interface/utils.c (DEF_FUNCTION_TYPE_10): Define.
+
 2013-04-10  Jakub Jelinek  <ja...@redhat.com>
 
        * gcc-interface/utils.c (DEF_FUNCTION_TYPE_8): Define.
 
-Copyright (C) 2013 Free Software Foundation, Inc.
+Copyright (C) 2013-2014 Free Software Foundation, Inc.
 
 Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
diff --git gcc/ada/gcc-interface/utils.c gcc/ada/gcc-interface/utils.c
index 014fe36..6267f20 100644
--- gcc/ada/gcc-interface/utils.c
+++ gcc/ada/gcc-interface/utils.c
@@ -5822,6 +5822,7 @@ enum c_builtin_type
 #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) 
NAME,
 #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7) NAME,
 #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7, ARG8) NAME,
+#define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7, ARG8, ARG9, ARG10) NAME,
 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
@@ -5841,6 +5842,7 @@ enum c_builtin_type
 #undef DEF_FUNCTION_TYPE_6
 #undef DEF_FUNCTION_TYPE_7
 #undef DEF_FUNCTION_TYPE_8
+#undef DEF_FUNCTION_TYPE_10
 #undef DEF_FUNCTION_TYPE_VAR_0
 #undef DEF_FUNCTION_TYPE_VAR_1
 #undef DEF_FUNCTION_TYPE_VAR_2
@@ -5940,6 +5942,10 @@ install_builtin_function_types (void)
                            ARG6, ARG7, ARG8)                           \
   def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \
               ARG7, ARG8);
+#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                            ARG6, ARG7, ARG8, ARG9, ARG10)             \
+  def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \
+              ARG7, ARG8, ARG9, ARG10);
 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
   def_fn_type (ENUM, RETURN, 1, 0);
 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
@@ -5964,6 +5970,7 @@ install_builtin_function_types (void)
 #undef DEF_FUNCTION_TYPE_4
 #undef DEF_FUNCTION_TYPE_5
 #undef DEF_FUNCTION_TYPE_6
+#undef DEF_FUNCTION_TYPE_10
 #undef DEF_FUNCTION_TYPE_VAR_0
 #undef DEF_FUNCTION_TYPE_VAR_1
 #undef DEF_FUNCTION_TYPE_VAR_2
diff --git gcc/builtin-types.def gcc/builtin-types.def
index fba9c7d..c09a62d 100644
--- gcc/builtin-types.def
+++ gcc/builtin-types.def
@@ -524,6 +524,10 @@ DEF_FUNCTION_TYPE_8 
(BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR,
                     BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG,
                     BT_BOOL, BT_UINT, BT_PTR)
 
+DEF_FUNCTION_TYPE_10 (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT,
+                     BT_VOID, BT_INT, BT_PTR_FN_VOID_PTR, BT_PTR, BT_SIZE,
+                     BT_PTR, BT_PTR, BT_PTR, BT_INT, BT_INT, BT_INT)
+
 DEF_FUNCTION_TYPE_VAR_0 (BT_FN_VOID_VAR, BT_VOID)
 DEF_FUNCTION_TYPE_VAR_0 (BT_FN_INT_VAR, BT_INT)
 DEF_FUNCTION_TYPE_VAR_0 (BT_FN_PTR_VAR, BT_PTR)
diff --git gcc/c-family/ChangeLog.gomp gcc/c-family/ChangeLog.gomp
index 3b4a335..5067a85 100644
--- gcc/c-family/ChangeLog.gomp
+++ gcc/c-family/ChangeLog.gomp
@@ -1,3 +1,11 @@
+2014-03-18  Thomas Schwinge  <tho...@codesourcery.com>
+
+       * c-pragma.h (enum pragma_omp_clause): Add
+       PRAGMA_OMP_CLAUSE_NUM_GANGS, PRAGMA_OMP_CLAUSE_NUM_WORKERS,
+       PRAGMA_OMP_CLAUSE_VECTOR_LENGTH.
+
+       * c-common.c (DEF_FUNCTION_TYPE_10): Define.
+
 2014-02-28  Thomas Schwinge  <tho...@codesourcery.com>
 
        * c-pragma.c (oacc_pragmas): Add "kernels".
diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c
index abd96fb..c4c7125 100644
--- gcc/c-family/c-common.c
+++ gcc/c-family/c-common.c
@@ -5114,6 +5114,7 @@ enum c_builtin_type
 #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) 
NAME,
 #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7) NAME,
 #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7, ARG8) NAME,
+#define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7, ARG8, ARG9, ARG10) NAME,
 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
@@ -5133,6 +5134,7 @@ enum c_builtin_type
 #undef DEF_FUNCTION_TYPE_6
 #undef DEF_FUNCTION_TYPE_7
 #undef DEF_FUNCTION_TYPE_8
+#undef DEF_FUNCTION_TYPE_10
 #undef DEF_FUNCTION_TYPE_VAR_0
 #undef DEF_FUNCTION_TYPE_VAR_1
 #undef DEF_FUNCTION_TYPE_VAR_2
@@ -5219,6 +5221,10 @@ c_define_builtins (tree va_list_ref_type_node, tree 
va_list_arg_type_node)
                            ARG6, ARG7, ARG8)                           \
   def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \
               ARG7, ARG8);
+#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                            ARG6, ARG7, ARG8, ARG9, ARG10)             \
+  def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \
+              ARG7, ARG8, ARG9, ARG10);
 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
   def_fn_type (ENUM, RETURN, 1, 0);
 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
@@ -5243,6 +5249,7 @@ c_define_builtins (tree va_list_ref_type_node, tree 
va_list_arg_type_node)
 #undef DEF_FUNCTION_TYPE_4
 #undef DEF_FUNCTION_TYPE_5
 #undef DEF_FUNCTION_TYPE_6
+#undef DEF_FUNCTION_TYPE_10
 #undef DEF_FUNCTION_TYPE_VAR_0
 #undef DEF_FUNCTION_TYPE_VAR_1
 #undef DEF_FUNCTION_TYPE_VAR_2
diff --git gcc/c-family/c-pragma.h gcc/c-family/c-pragma.h
index d55a511..f08e40f 100644
--- gcc/c-family/c-pragma.h
+++ gcc/c-family/c-pragma.h
@@ -95,8 +95,10 @@ typedef enum pragma_omp_clause {
   PRAGMA_OMP_CLAUSE_MERGEABLE,
   PRAGMA_OMP_CLAUSE_NOTINBRANCH,
   PRAGMA_OMP_CLAUSE_NOWAIT,
+  PRAGMA_OMP_CLAUSE_NUM_GANGS,
   PRAGMA_OMP_CLAUSE_NUM_TEAMS,
   PRAGMA_OMP_CLAUSE_NUM_THREADS,
+  PRAGMA_OMP_CLAUSE_NUM_WORKERS,
   PRAGMA_OMP_CLAUSE_ORDERED,
   PRAGMA_OMP_CLAUSE_PARALLEL,
   PRAGMA_OMP_CLAUSE_PRESENT,
@@ -117,6 +119,7 @@ typedef enum pragma_omp_clause {
   PRAGMA_OMP_CLAUSE_TO,
   PRAGMA_OMP_CLAUSE_UNIFORM,
   PRAGMA_OMP_CLAUSE_UNTIED,
+  PRAGMA_OMP_CLAUSE_VECTOR_LENGTH,
   
   /* Clauses for Cilk Plus SIMD-enabled function.  */
   PRAGMA_CILK_CLAUSE_NOMASK,
diff --git gcc/c/ChangeLog.gomp gcc/c/ChangeLog.gomp
index 0551026..4f648ea 100644
--- gcc/c/ChangeLog.gomp
+++ gcc/c/ChangeLog.gomp
@@ -1,3 +1,14 @@
+2014-04-18  Thomas Schwinge  <tho...@codesourcery.com>
+
+       * c-parser.c (c_parser_omp_clause_num_gangs)
+       (c_parser_omp_clause_num_workers)
+       (c_parser_omp_clause_vector_length): New functions.
+       (c_parser_omp_clause_name, c_parser_oacc_all_clauses): Handle
+       PRAGMA_OMP_CLAUSE_NUM_GANGS, PRAGMA_OMP_CLAUSE_NUM_WORKERS,
+       PRAGMA_OMP_CLAUSE_VECTOR_LENGTH.
+       (OACC_PARALLEL_CLAUSE_MARK): Add these.
+       * c-typeck.c (c_finish_omp_clauses): Handle these.
+
 2014-02-28  Thomas Schwinge  <tho...@codesourcery.com>
 
        * c-parser.c (OACC_KERNELS_CLAUSE_MASK): New macro definition.
diff --git gcc/c/c-parser.c gcc/c/c-parser.c
index 3d8c0de..9161577 100644
--- gcc/c/c-parser.c
+++ gcc/c/c-parser.c
@@ -9671,10 +9671,14 @@ c_parser_omp_clause_name (c_parser *parser)
            result = PRAGMA_OMP_CLAUSE_NOTINBRANCH;
          else if (!strcmp ("nowait", p))
            result = PRAGMA_OMP_CLAUSE_NOWAIT;
+         else if (!strcmp ("num_gangs", p))
+           result = PRAGMA_OMP_CLAUSE_NUM_GANGS;
          else if (!strcmp ("num_teams", p))
            result = PRAGMA_OMP_CLAUSE_NUM_TEAMS;
          else if (!strcmp ("num_threads", p))
            result = PRAGMA_OMP_CLAUSE_NUM_THREADS;
+         else if (!strcmp ("num_workers", p))
+           result = PRAGMA_OMP_CLAUSE_NUM_WORKERS;
          else if (flag_cilkplus && !strcmp ("nomask", p))
            result = PRAGMA_CILK_CLAUSE_NOMASK;
          break;
@@ -9735,7 +9739,9 @@ c_parser_omp_clause_name (c_parser *parser)
            result = PRAGMA_OMP_CLAUSE_UNTIED;
          break;
        case 'v':
-         if (flag_cilkplus && !strcmp ("vectorlength", p))
+         if (!strcmp ("vector_length", p))
+           result = PRAGMA_OMP_CLAUSE_VECTOR_LENGTH;
+         else if (flag_cilkplus && !strcmp ("vectorlength", p))
            result = PRAGMA_CILK_CLAUSE_VECTORLENGTH;
          break;
        }
@@ -10198,6 +10204,51 @@ c_parser_omp_clause_nowait (c_parser *parser 
ATTRIBUTE_UNUSED, tree list)
   return c;
 }
 
+/* OpenACC:
+   num_gangs ( expression ) */
+
+static tree
+c_parser_omp_clause_num_gangs (c_parser *parser, tree list)
+{
+  location_t num_gangs_loc = c_parser_peek_token (parser)->location;
+  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
+    {
+      location_t expr_loc = c_parser_peek_token (parser)->location;
+      tree c, t = c_parser_expression (parser).value;
+      mark_exp_read (t);
+      t = c_fully_fold (t, false, NULL);
+
+      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
+
+      if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
+       {
+         c_parser_error (parser, "expected integer expression");
+         return list;
+       }
+
+      /* Attempt to statically determine when the number isn't positive.  */
+      c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
+                      build_int_cst (TREE_TYPE (t), 0));
+      if (CAN_HAVE_LOCATION_P (c))
+       SET_EXPR_LOCATION (c, expr_loc);
+      if (c == boolean_true_node)
+       {
+         warning_at (expr_loc, 0,
+                     "%<num_gangs%> value must be positive");
+         t = integer_one_node;
+       }
+
+      check_no_duplicate_clause (list, OMP_CLAUSE_NUM_GANGS, "num_gangs");
+
+      c = build_omp_clause (num_gangs_loc, OMP_CLAUSE_NUM_GANGS);
+      OMP_CLAUSE_NUM_GANGS_EXPR (c) = t;
+      OMP_CLAUSE_CHAIN (c) = list;
+      list = c;
+    }
+
+  return list;
+}
+
 /* OpenMP 2.5:
    num_threads ( expression ) */
 
@@ -10243,6 +10294,51 @@ c_parser_omp_clause_num_threads (c_parser *parser, 
tree list)
   return list;
 }
 
+/* OpenACC:
+   num_workers ( expression ) */
+
+static tree
+c_parser_omp_clause_num_workers (c_parser *parser, tree list)
+{
+  location_t num_workers_loc = c_parser_peek_token (parser)->location;
+  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
+    {
+      location_t expr_loc = c_parser_peek_token (parser)->location;
+      tree c, t = c_parser_expression (parser).value;
+      mark_exp_read (t);
+      t = c_fully_fold (t, false, NULL);
+
+      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
+
+      if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
+       {
+         c_parser_error (parser, "expected integer expression");
+         return list;
+       }
+
+      /* Attempt to statically determine when the number isn't positive.  */
+      c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
+                      build_int_cst (TREE_TYPE (t), 0));
+      if (CAN_HAVE_LOCATION_P (c))
+       SET_EXPR_LOCATION (c, expr_loc);
+      if (c == boolean_true_node)
+       {
+         warning_at (expr_loc, 0,
+                     "%<num_workers%> value must be positive");
+         t = integer_one_node;
+       }
+
+      check_no_duplicate_clause (list, OMP_CLAUSE_NUM_WORKERS, "num_workers");
+
+      c = build_omp_clause (num_workers_loc, OMP_CLAUSE_NUM_WORKERS);
+      OMP_CLAUSE_NUM_WORKERS_EXPR (c) = t;
+      OMP_CLAUSE_CHAIN (c) = list;
+      list = c;
+    }
+
+  return list;
+}
+
 /* OpenMP 2.5:
    ordered */
 
@@ -10494,6 +10590,51 @@ c_parser_omp_clause_untied (c_parser *parser 
ATTRIBUTE_UNUSED, tree list)
   return c;
 }
 
+/* OpenACC:
+   vector_length ( expression ) */
+
+static tree
+c_parser_omp_clause_vector_length (c_parser *parser, tree list)
+{
+  location_t vector_length_loc = c_parser_peek_token (parser)->location;
+  if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
+    {
+      location_t expr_loc = c_parser_peek_token (parser)->location;
+      tree c, t = c_parser_expression (parser).value;
+      mark_exp_read (t);
+      t = c_fully_fold (t, false, NULL);
+
+      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
+
+      if (!INTEGRAL_TYPE_P (TREE_TYPE (t)))
+       {
+         c_parser_error (parser, "expected integer expression");
+         return list;
+       }
+
+      /* Attempt to statically determine when the number isn't positive.  */
+      c = fold_build2_loc (expr_loc, LE_EXPR, boolean_type_node, t,
+                      build_int_cst (TREE_TYPE (t), 0));
+      if (CAN_HAVE_LOCATION_P (c))
+       SET_EXPR_LOCATION (c, expr_loc);
+      if (c == boolean_true_node)
+       {
+         warning_at (expr_loc, 0,
+                     "%<vector_length%> value must be positive");
+         t = integer_one_node;
+       }
+
+      check_no_duplicate_clause (list, OMP_CLAUSE_VECTOR_LENGTH, 
"vector_length");
+
+      c = build_omp_clause (vector_length_loc, OMP_CLAUSE_VECTOR_LENGTH);
+      OMP_CLAUSE_VECTOR_LENGTH_EXPR (c) = t;
+      OMP_CLAUSE_CHAIN (c) = list;
+      list = c;
+    }
+
+  return list;
+}
+
 /* OpenMP 4.0:
    inbranch
    notinbranch */
@@ -11079,6 +11220,14 @@ c_parser_oacc_all_clauses (c_parser *parser, 
omp_clause_mask mask,
          clauses = c_parser_oacc_data_clause_deviceptr (parser, clauses);
          c_name = "deviceptr";
          break;
+       case PRAGMA_OMP_CLAUSE_NUM_GANGS:
+         clauses = c_parser_omp_clause_num_gangs (parser, clauses);
+         c_name = "num_gangs";
+         break;
+       case PRAGMA_OMP_CLAUSE_NUM_WORKERS:
+         clauses = c_parser_omp_clause_num_workers (parser, clauses);
+         c_name = "num_workers";
+         break;
        case PRAGMA_OMP_CLAUSE_PRESENT:
          clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
          c_name = "present";
@@ -11099,6 +11248,10 @@ c_parser_oacc_all_clauses (c_parser *parser, 
omp_clause_mask mask,
          clauses = c_parser_oacc_data_clause (parser, c_kind, clauses);
          c_name = "present_or_create";
          break;
+       case PRAGMA_OMP_CLAUSE_VECTOR_LENGTH:
+         clauses = c_parser_omp_clause_vector_length (parser, clauses);
+         c_name = "vector_length";
+         break;
        default:
          c_parser_error (parser, "expected clause");
          goto saw_error;
@@ -11452,11 +11605,14 @@ c_parser_oacc_kernels (location_t loc, c_parser 
*parser)
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_COPYOUT)              \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_CREATE)               \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICEPTR)            \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_GANGS)            \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_NUM_WORKERS)          \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT)              \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPY)      \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYIN)    \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_COPYOUT)   \
-       | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE) )
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_PRESENT_OR_CREATE)    \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_VECTOR_LENGTH) )
 
 static tree
 c_parser_oacc_parallel (location_t loc, c_parser *parser)
diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c
index 729ea49..da8f344 100644
--- gcc/c/c-typeck.c
+++ gcc/c/c-typeck.c
@@ -12187,6 +12187,9 @@ c_finish_omp_clauses (tree clauses)
        case OMP_CLAUSE_SECTIONS:
        case OMP_CLAUSE_TASKGROUP:
        case OMP_CLAUSE_PROC_BIND:
+       case OMP_CLAUSE_NUM_GANGS:
+       case OMP_CLAUSE_NUM_WORKERS:
+       case OMP_CLAUSE_VECTOR_LENGTH:
          pc = &OMP_CLAUSE_CHAIN (c);
          continue;
 
diff --git gcc/fortran/ChangeLog.gomp gcc/fortran/ChangeLog.gomp
index e1ab335..1ee6a7c 100644
--- gcc/fortran/ChangeLog.gomp
+++ gcc/fortran/ChangeLog.gomp
@@ -1,3 +1,9 @@
+2014-03-18  Thomas Schwinge  <tho...@codesourcery.com>
+
+       * f95-lang.c (DEF_FUNCTION_TYPE_10): Define.
+       * types.def
+       (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT): New type.
+
 2014-03-13  Ilmir Usmanov  <i.usma...@samsung.com>
 
        OpenACC 1.0 support.
@@ -171,7 +177,7 @@
 
        * f95-lang.c (ATTR_NULL): Define.
 
-Copyright (C) 2013 Free Software Foundation, Inc.
+Copyright (C) 2013-2014 Free Software Foundation, Inc.
 
 Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
diff --git gcc/fortran/f95-lang.c gcc/fortran/f95-lang.c
index 727059b..2888df7 100644
--- gcc/fortran/f95-lang.c
+++ gcc/fortran/f95-lang.c
@@ -620,6 +620,7 @@ gfc_init_builtin_functions (void)
 #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) 
NAME,
 #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7) NAME,
 #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7, ARG8) NAME,
+#define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7, ARG8, ARG9, ARG10) NAME,
 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
 #define DEF_POINTER_TYPE(NAME, TYPE) NAME,
 #include "types.def"
@@ -633,6 +634,7 @@ gfc_init_builtin_functions (void)
 #undef DEF_FUNCTION_TYPE_6
 #undef DEF_FUNCTION_TYPE_7
 #undef DEF_FUNCTION_TYPE_8
+#undef DEF_FUNCTION_TYPE_10
 #undef DEF_FUNCTION_TYPE_VAR_0
 #undef DEF_POINTER_TYPE
     BT_LAST
@@ -1008,6 +1010,21 @@ gfc_init_builtin_functions (void)
                                builtin_types[(int) ARG7],              \
                                builtin_types[(int) ARG8],              \
                                NULL_TREE);
+#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                            ARG6, ARG7, ARG8, ARG9, ARG10)             \
+  builtin_types[(int) ENUM]                                            \
+    = build_function_type_list (builtin_types[(int) RETURN],           \
+                               builtin_types[(int) ARG1],              \
+                               builtin_types[(int) ARG2],              \
+                               builtin_types[(int) ARG3],              \
+                               builtin_types[(int) ARG4],              \
+                               builtin_types[(int) ARG5],              \
+                               builtin_types[(int) ARG6],              \
+                               builtin_types[(int) ARG7],              \
+                               builtin_types[(int) ARG8],              \
+                               builtin_types[(int) ARG9],              \
+                               builtin_types[(int) ARG10],             \
+                               NULL_TREE);
 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN)                          \
   builtin_types[(int) ENUM]                                            \
     = build_varargs_function_type_list (builtin_types[(int) RETURN],    \
@@ -1023,6 +1040,7 @@ gfc_init_builtin_functions (void)
 #undef DEF_FUNCTION_TYPE_4
 #undef DEF_FUNCTION_TYPE_5
 #undef DEF_FUNCTION_TYPE_6
+#undef DEF_FUNCTION_TYPE_10
 #undef DEF_FUNCTION_TYPE_VAR_0
 #undef DEF_POINTER_TYPE
   builtin_types[(int) BT_LAST] = NULL_TREE;
diff --git gcc/fortran/types.def gcc/fortran/types.def
index 78fc679..cba1f7e 100644
--- gcc/fortran/types.def
+++ gcc/fortran/types.def
@@ -214,4 +214,8 @@ DEF_FUNCTION_TYPE_8 
(BT_FN_VOID_OMPFN_PTR_OMPCPYFN_LONG_LONG_BOOL_UINT_PTR,
                     BT_PTR_FN_VOID_PTR_PTR, BT_LONG, BT_LONG,
                     BT_BOOL, BT_UINT, BT_PTR)
 
+DEF_FUNCTION_TYPE_10 (BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT,
+                     BT_VOID, BT_INT, BT_PTR_FN_VOID_PTR, BT_PTR, BT_SIZE,
+                     BT_PTR, BT_PTR, BT_PTR, BT_INT, BT_INT, BT_INT)
+
 DEF_FUNCTION_TYPE_VAR_0 (BT_FN_VOID_VAR, BT_VOID)
diff --git gcc/gimplify.c gcc/gimplify.c
index f3c34f9..8f6da3f 100644
--- gcc/gimplify.c
+++ gcc/gimplify.c
@@ -6176,6 +6176,9 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq 
*pre_p,
        case OMP_CLAUSE_THREAD_LIMIT:
        case OMP_CLAUSE_DIST_SCHEDULE:
        case OMP_CLAUSE_DEVICE:
+       case OMP_CLAUSE_NUM_GANGS:
+       case OMP_CLAUSE_NUM_WORKERS:
+       case OMP_CLAUSE_VECTOR_LENGTH:
          if (gimplify_expr (&OMP_CLAUSE_OPERAND (c, 0), pre_p, NULL,
                             is_gimple_val, fb_rvalue) == GS_ERROR)
            remove = true;
@@ -6192,9 +6195,6 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq 
*pre_p,
        case OMP_CLAUSE_INDEPENDENT:
        case OMP_CLAUSE_WORKER:
        case OMP_CLAUSE_VECTOR:
-       case OMP_CLAUSE_NUM_GANGS:
-       case OMP_CLAUSE_NUM_WORKERS:
-       case OMP_CLAUSE_VECTOR_LENGTH:
          remove = true;
          break;
 
@@ -6539,6 +6539,9 @@ gimplify_adjust_omp_clauses (tree *list_p)
        case OMP_CLAUSE_PROC_BIND:
        case OMP_CLAUSE_SAFELEN:
        case OMP_CLAUSE_DEPEND:
+       case OMP_CLAUSE_NUM_GANGS:
+       case OMP_CLAUSE_NUM_WORKERS:
+       case OMP_CLAUSE_VECTOR_LENGTH:
          break;
 
        case OMP_CLAUSE_HOST:
@@ -6552,9 +6555,6 @@ gimplify_adjust_omp_clauses (tree *list_p)
        case OMP_CLAUSE_INDEPENDENT:
        case OMP_CLAUSE_WORKER:
        case OMP_CLAUSE_VECTOR:
-       case OMP_CLAUSE_NUM_GANGS:
-       case OMP_CLAUSE_NUM_WORKERS:
-       case OMP_CLAUSE_VECTOR_LENGTH:
        default:
          gcc_unreachable ();
        }
diff --git gcc/lto/ChangeLog.gomp gcc/lto/ChangeLog.gomp
index 96cf420..b82833e 100644
--- gcc/lto/ChangeLog.gomp
+++ gcc/lto/ChangeLog.gomp
@@ -1,8 +1,12 @@
+2014-03-18  Thomas Schwinge  <tho...@codesourcery.com>
+
+       * c-common.c (DEF_FUNCTION_TYPE_10): Define.
+
 2013-04-10  Jakub Jelinek  <ja...@redhat.com>
 
        * lto-lang.c (DEF_FUNCTION_TYPE_8): Define.
 
-Copyright (C) 2013 Free Software Foundation, Inc.
+Copyright (C) 2013-2014 Free Software Foundation, Inc.
 
 Copying and distribution of this file, with or without modification,
 are permitted in any medium without royalty provided the copyright
diff --git gcc/lto/lto-lang.c gcc/lto/lto-lang.c
index 28eac6f..b7a7d05 100644
--- gcc/lto/lto-lang.c
+++ gcc/lto/lto-lang.c
@@ -149,6 +149,7 @@ enum lto_builtin_type
 #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) 
NAME,
 #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7) NAME,
 #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7, ARG8) NAME,
+#define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, 
ARG7, ARG8, ARG9, ARG10) NAME,
 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
@@ -168,6 +169,7 @@ enum lto_builtin_type
 #undef DEF_FUNCTION_TYPE_6
 #undef DEF_FUNCTION_TYPE_7
 #undef DEF_FUNCTION_TYPE_8
+#undef DEF_FUNCTION_TYPE_10
 #undef DEF_FUNCTION_TYPE_VAR_0
 #undef DEF_FUNCTION_TYPE_VAR_1
 #undef DEF_FUNCTION_TYPE_VAR_2
@@ -645,6 +647,10 @@ lto_define_builtins (tree va_list_ref_type_node 
ATTRIBUTE_UNUSED,
                            ARG6, ARG7, ARG8)                           \
   def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \
               ARG7, ARG8);
+#define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
+                            ARG6, ARG7, ARG8, ARG9, ARG10)             \
+  def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, \
+              ARG7, ARG8, ARG9, ARG10);
 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
   def_fn_type (ENUM, RETURN, 1, 0);
 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
@@ -669,6 +675,7 @@ lto_define_builtins (tree va_list_ref_type_node 
ATTRIBUTE_UNUSED,
 #undef DEF_FUNCTION_TYPE_4
 #undef DEF_FUNCTION_TYPE_5
 #undef DEF_FUNCTION_TYPE_6
+#undef DEF_FUNCTION_TYPE_10
 #undef DEF_FUNCTION_TYPE_VAR_0
 #undef DEF_FUNCTION_TYPE_VAR_1
 #undef DEF_FUNCTION_TYPE_VAR_2
diff --git gcc/oacc-builtins.def gcc/oacc-builtins.def
index 2d5c22c..3935da4 100644
--- gcc/oacc-builtins.def
+++ gcc/oacc-builtins.def
@@ -32,6 +32,8 @@ DEF_GOACC_BUILTIN (BUILT_IN_GOACC_DATA_START, 
"GOACC_data_start",
 DEF_GOACC_BUILTIN (BUILT_IN_GOACC_DATA_END, "GOACC_data_end",
                   BT_FN_VOID, ATTR_NOTHROW_LIST)
 DEF_GOACC_BUILTIN (BUILT_IN_GOACC_KERNELS, "GOACC_kernels",
-                  BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
+                  BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT,
+                  ATTR_NOTHROW_LIST)
 DEF_GOACC_BUILTIN (BUILT_IN_GOACC_PARALLEL, "GOACC_parallel",
-                  BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR, ATTR_NOTHROW_LIST)
+                  BT_FN_VOID_INT_OMPFN_PTR_SIZE_PTR_PTR_PTR_INT_INT_INT,
+                  ATTR_NOTHROW_LIST)
diff --git gcc/omp-low.c gcc/omp-low.c
index aa2dd32..f1b0fa5 100644
--- gcc/omp-low.c
+++ gcc/omp-low.c
@@ -1622,6 +1622,9 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
        case OMP_CLAUSE_DIST_SCHEDULE:
        case OMP_CLAUSE_DEPEND:
          gcc_assert (!is_gimple_omp_oacc_specifically (ctx->stmt));
+       case OMP_CLAUSE_NUM_GANGS:
+       case OMP_CLAUSE_NUM_WORKERS:
+       case OMP_CLAUSE_VECTOR_LENGTH:
          if (ctx->outer)
            scan_omp_op (&OMP_CLAUSE_OPERAND (c, 0), ctx->outer);
          break;
@@ -1759,9 +1762,6 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
        case OMP_CLAUSE_INDEPENDENT:
        case OMP_CLAUSE_WORKER:
        case OMP_CLAUSE_VECTOR:
-       case OMP_CLAUSE_NUM_GANGS:
-       case OMP_CLAUSE_NUM_WORKERS:
-       case OMP_CLAUSE_VECTOR_LENGTH:
          sorry ("Clause not supported yet");
          break;
 
@@ -1886,6 +1886,9 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
        case OMP_CLAUSE_TO:
        case OMP_CLAUSE_FROM:
          gcc_assert (!is_gimple_omp_oacc_specifically (ctx->stmt));
+       case OMP_CLAUSE_NUM_GANGS:
+       case OMP_CLAUSE_NUM_WORKERS:
+       case OMP_CLAUSE_VECTOR_LENGTH:
          break;
 
        case OMP_CLAUSE_HOST:
@@ -1899,9 +1902,6 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
        case OMP_CLAUSE_INDEPENDENT:
        case OMP_CLAUSE_WORKER:
        case OMP_CLAUSE_VECTOR:
-       case OMP_CLAUSE_NUM_GANGS:
-       case OMP_CLAUSE_NUM_WORKERS:
-       case OMP_CLAUSE_VECTOR_LENGTH:
          sorry ("Clause not supported yet");
          break;
 
@@ -5039,7 +5039,9 @@ expand_oacc_offload (struct omp_region *region)
     }
 
   /* Emit a library call to launch CHILD_FN.  */
-  tree t1, t2, t3, t4, device, c, clauses;
+  tree t1, t2, t3, t4,
+    t_num_gangs, t_num_workers, t_vector_length,
+    device, c, clauses;
   enum built_in_function start_ix;
   location_t clause_loc;
   tree (*gimple_omp_clauses) (const_gimple);
@@ -5059,6 +5061,36 @@ expand_oacc_offload (struct omp_region *region)
 
   clauses = gimple_omp_clauses (entry_stmt);
 
+  /* Default values for NUM_GANGS, NUM_WORKERS, and VECTOR_LENGTH.  */
+  t_num_gangs = t_num_workers = t_vector_length
+    = fold_convert_loc (gimple_location (entry_stmt),
+                       integer_type_node, integer_one_node);
+  switch (region->type)
+    {
+    case GIMPLE_OACC_PARALLEL:
+      /* ..., but if present, use the values specified by the respective
+        clauses, making sure these are of the correct type.  */
+      c = find_omp_clause (clauses, OMP_CLAUSE_NUM_GANGS);
+      if (c)
+       t_num_gangs = fold_convert_loc (OMP_CLAUSE_LOCATION (c),
+                                       integer_type_node,
+                                       OMP_CLAUSE_NUM_GANGS_EXPR (c));
+      c = find_omp_clause (clauses, OMP_CLAUSE_NUM_WORKERS);
+      if (c)
+       t_num_workers = fold_convert_loc (OMP_CLAUSE_LOCATION (c),
+                                         integer_type_node,
+                                         OMP_CLAUSE_NUM_WORKERS_EXPR (c));
+      c = find_omp_clause (clauses, OMP_CLAUSE_VECTOR_LENGTH);
+      if (c)
+       t_vector_length = fold_convert_loc (OMP_CLAUSE_LOCATION (c),
+                                           integer_type_node,
+                                           OMP_CLAUSE_VECTOR_LENGTH_EXPR (c));
+      break;
+
+    default:
+      break;
+    }
+
   /* By default, the value of DEVICE is -1 (let runtime library choose).  */
   device = build_int_cst (integer_type_node, -1);
 
@@ -5100,7 +5132,8 @@ expand_oacc_offload (struct omp_region *region)
   tree openmp_target = build_zero_cst (ptr_type_node);
   tree fnaddr = build_fold_addr_expr (child_fn);
   g = gimple_build_call (builtin_decl_explicit (start_ix),
-                        7, device, fnaddr, openmp_target, t1, t2, t3, t4);
+                        10, device, fnaddr, openmp_target, t1, t2, t3, t4,
+                        t_num_gangs, t_num_workers, t_vector_length);
   gimple_set_location (g, gimple_location (entry_stmt));
   gsi_insert_before (&gsi, g, GSI_SAME_STMT);
 }
diff --git libgomp/ChangeLog.gomp libgomp/ChangeLog.gomp
index 7f9ce11..187c0701 100644
--- libgomp/ChangeLog.gomp
+++ libgomp/ChangeLog.gomp
@@ -1,3 +1,11 @@
+2014-03-18  Thomas Schwinge  <tho...@codesourcery.com>
+
+       * libgomp_g.h (GOACC_kernels, GOACC_parallel): Add three
+       additional int arguments.
+       * oacc-parallel.c (GOACC_kernels, GOACC_parallel): Handle these.
+       * testsuite/libgomp.oacc-c/goacc_kernels.c: Adjust.
+       * testsuite/libgomp.oacc-c/goacc_parallel.c: Likewise.
+
 2014-02-28  Thomas Schwinge  <tho...@codesourcery.com>
 
        * testsuite/libgomp.oacc-c/goacc_kernels.c: New file.
diff --git libgomp/libgomp_g.h libgomp/libgomp_g.h
index 9681566..9dca76a9 100644
--- libgomp/libgomp_g.h
+++ libgomp/libgomp_g.h
@@ -220,8 +220,10 @@ extern void GOACC_data_start (int, const void *,
                              size_t, void **, size_t *, unsigned short *);
 extern void GOACC_data_end (void);
 extern void GOACC_kernels (int, void (*) (void *), const void *,
-                          size_t, void **, size_t *, unsigned short *);
+                          size_t, void **, size_t *, unsigned short *,
+                          int, int, int);
 extern void GOACC_parallel (int, void (*) (void *), const void *,
-                           size_t, void **, size_t *, unsigned short *);
+                           size_t, void **, size_t *, unsigned short *,
+                           int, int, int);
 
 #endif /* LIBGOMP_G_H */
diff --git libgomp/oacc-parallel.c libgomp/oacc-parallel.c
index cb883a8..b1fd898 100644
--- libgomp/oacc-parallel.c
+++ libgomp/oacc-parallel.c
@@ -31,7 +31,8 @@
 void
 GOACC_parallel (int device, void (*fn) (void *), const void *openmp_target,
                size_t mapnum, void **hostaddrs, size_t *sizes,
-               unsigned short *kinds)
+               unsigned short *kinds,
+               int num_gangs, int num_workers, int vector_length)
 {
   unsigned char kinds_[mapnum];
   size_t i;
@@ -49,6 +50,16 @@ GOACC_parallel (int device, void (*fn) (void *), const void 
*openmp_target,
 
       kinds_[i] = kind | align << 3;
     }
+  if (num_gangs != 1)
+    gomp_fatal ("num_gangs (%d) different from one is not yet supported",
+               num_gangs);
+  if (num_workers != 1)
+    gomp_fatal ("num_workers (%d) different from one is not yet supported",
+               num_workers);
+  if (vector_length != 1)
+    gomp_fatal ("vector_length (%d) different from one is not yet supported",
+               vector_length);
+
   GOMP_target (device, fn, openmp_target, mapnum, hostaddrs, sizes, kinds_);
 }
 
@@ -86,8 +97,10 @@ GOACC_data_end (void)
 void
 GOACC_kernels (int device, void (*fn) (void *), const void *openmp_target,
               size_t mapnum, void **hostaddrs, size_t *sizes,
-              unsigned short *kinds)
+              unsigned short *kinds,
+              int num_gangs, int num_workers, int vector_length)
 {
   /* TODO.  */
-  GOACC_parallel (device, fn, openmp_target, mapnum, hostaddrs, sizes, kinds);
+  GOACC_parallel (device, fn, openmp_target, mapnum, hostaddrs, sizes, kinds,
+                 num_gangs, num_workers, vector_length);
 }
diff --git libgomp/testsuite/libgomp.oacc-c/goacc_kernels.c 
libgomp/testsuite/libgomp.oacc-c/goacc_kernels.c
index db1a37d..b41e558 100644
--- libgomp/testsuite/libgomp.oacc-c/goacc_kernels.c
+++ libgomp/testsuite/libgomp.oacc-c/goacc_kernels.c
@@ -17,7 +17,9 @@ f (void *data)
 int main(void)
 {
   i = -1;
-  GOACC_kernels (0, f, (const void *) 0, 0, (void *) 0, (void *) 0, (void *) 
0);
+  GOACC_kernels (0, f, (const void *) 0,
+                0, (void *) 0, (void *) 0, (void *) 0,
+                1, 1, 1);
   if (i != 42)
     abort ();
 
diff --git libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c 
libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c
index b9bdffa..4ab1e9b 100644
--- libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c
+++ libgomp/testsuite/libgomp.oacc-c/goacc_parallel.c
@@ -17,7 +17,9 @@ f (void *data)
 int main(void)
 {
   i = -1;
-  GOACC_parallel (0, f, (const void *) 0, 0, (void *) 0, (void *) 0, (void *) 
0);
+  GOACC_parallel (0, f, (const void *) 0,
+                 0, (void *) 0, (void *) 0, (void *) 0,
+                 1, 1, 1);
   if (i != 42)
     abort ();
 


Grüße,
 Thomas

Attachment: pgptQJm3LOHVi.pgp
Description: PGP signature

Reply via email to