Hi!

OpenMP 5.1 and earlier had 2 different uses of to clause, one for target
update construct with one semantics, and one for declare target directive
with a different semantics.
Under the hood we were using OMP_CLAUSE_TO_DECLARE to represent the latter.
OpenMP 5.2 renamed the declare target clause to to enter, the old one is
kept as a deprecated alias.

As we are far from having full OpenMP 5.2 support, this patch adds support
for the enter clause (and renames OMP_CLAUSE_TO_DECLARE to OMP_CLAUSE_ENTER
with a flag to tell the spelling of the clause for better diagnostics),
but doesn't deprecate the to clause on declare target just yet (that
should be done as one of the last steps in 5.2 support).

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.

2022-05-27  Jakub Jelinek  <ja...@redhat.com>

gcc/
        * tree-core.h (enum omp_clause_code): Rename OMP_CLAUSE_TO_DECLARE
        to OMP_CLAUSE_ENTER.
        * tree.h (OMP_CLAUSE_ENTER_TO): Define.
        * tree.cc (omp_clause_num_ops, omp_clause_code_name): Rename
        OMP_CLAUSE_TO_DECLARE to OMP_CLAUSE_ENTER.
        * tree-pretty-print.cc (dump_omp_clause): Handle OMP_CLAUSE_ENTER
        instead of OMP_CLAUSE_TO_DECLARE, if OMP_CLAUSE_ENTER_TO, print
        "to" instead of "enter".
        * tree-nested.cc (convert_nonlocal_omp_clauses,
        convert_local_omp_clauses): Handle OMP_CLAUSE_ENTER instead of
        OMP_CLAUSE_TO_DECLARE.
gcc/c-family/
        * c-pragma.h (enum pragma_omp_clause): Add PRAGMA_OMP_CLAUSE_ENTER.
gcc/c/
        * c-parser.cc (c_parser_omp_clause_name): Parse enter clause.
        (c_parser_omp_all_clauses): For to clause on declare target, use
        OMP_CLAUSE_ENTER clause with OMP_CLAUSE_ENTER_TO instead of
        OMP_CLAUSE_TO_DECLARE clause.  Handle PRAGMA_OMP_CLAUSE_ENTER.
        (OMP_DECLARE_TARGET_CLAUSE_MASK): Add enter clause.
        (c_parser_omp_declare_target): Use OMP_CLAUSE_ENTER instead of
        OMP_CLAUSE_TO_DECLARE.
        * c-typeck.cc (c_finish_omp_clauses): Handle OMP_CLAUSE_ENTER instead
        of OMP_CLAUSE_TO_DECLARE, to OMP_CLAUSE_ENTER_TO use "to" as clause
        name in diagnostics instead of
        omp_clause_code_name[OMP_CLAUSE_CODE (c)].
gcc/cp/
        * parser.cc (cp_parser_omp_clause_name): Parse enter clause.
        (cp_parser_omp_all_clauses): For to clause on declare target, use
        OMP_CLAUSE_ENTER clause with OMP_CLAUSE_ENTER_TO instead of
        OMP_CLAUSE_TO_DECLARE clause.  Handle PRAGMA_OMP_CLAUSE_ENTER.
        (OMP_DECLARE_TARGET_CLAUSE_MASK): Add enter clause.
        (cp_parser_omp_declare_target): Use OMP_CLAUSE_ENTER instead of
        OMP_CLAUSE_TO_DECLARE.
        * semantics.cc (finish_omp_clauses): Handle OMP_CLAUSE_ENTER instead
        of OMP_CLAUSE_TO_DECLARE, to OMP_CLAUSE_ENTER_TO use "to" as clause
        name in diagnostics instead of
        omp_clause_code_name[OMP_CLAUSE_CODE (c)].
gcc/testsuite/
        * c-c++-common/gomp/clauses-3.c: Add tests with enter clause instead
        of to or modify some existing to clauses to enter.
        * c-c++-common/gomp/declare-target-1.c: Likewise.
        * c-c++-common/gomp/declare-target-2.c: Likewise.
        * c-c++-common/gomp/declare-target-3.c: Likewise.
        * g++.dg/gomp/attrs-9.C: Likewise.
        * g++.dg/gomp/declare-target-1.C: Likewise.
libgomp/
        * testsuite/libgomp.c-c++-common/target-40.c: Modify some existing to
        clauses to enter.
        * testsuite/libgomp.c/target-41.c: Likewise.

--- gcc/tree-core.h.jj  2022-05-27 11:29:15.787812586 +0200
+++ gcc/tree-core.h     2022-05-27 11:47:00.250820434 +0200
@@ -302,9 +302,9 @@ enum omp_clause_code {
   /* OpenMP clause: uniform (argument-list).  */
   OMP_CLAUSE_UNIFORM,
 
-  /* OpenMP clause: to (extended-list).
-     Only when it appears in declare target.  */
-  OMP_CLAUSE_TO_DECLARE,
+  /* OpenMP clause: enter (extended-list).
+     to is a deprecated alias when it appears in declare target.  */
+  OMP_CLAUSE_ENTER,
 
   /* OpenMP clause: link (variable-list).  */
   OMP_CLAUSE_LINK,
--- gcc/tree.h.jj       2022-05-27 11:29:16.026810118 +0200
+++ gcc/tree.h  2022-05-27 11:47:00.246820475 +0200
@@ -1925,6 +1925,10 @@ class auto_suppress_location_wrappers
 #define OMP_CLAUSE_BIND_KIND(NODE) \
   (OMP_CLAUSE_SUBCODE_CHECK (NODE, 
OMP_CLAUSE_BIND)->omp_clause.subcode.bind_kind)
 
+/* True if ENTER clause is spelled as TO.  */
+#define OMP_CLAUSE_ENTER_TO(NODE) \
+  (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_ENTER)->base.public_flag)
+
 #define OMP_CLAUSE_TILE_LIST(NODE) \
   OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_TILE), 0)
 #define OMP_CLAUSE_TILE_ITERVAR(NODE) \
--- gcc/tree.cc.jj      2022-05-27 11:29:15.954810861 +0200
+++ gcc/tree.cc 2022-05-27 11:47:00.238820558 +0200
@@ -280,7 +280,7 @@ unsigned const char omp_clause_num_ops[]
   1, /* OMP_CLAUSE_DEPEND  */
   1, /* OMP_CLAUSE_NONTEMPORAL  */
   1, /* OMP_CLAUSE_UNIFORM  */
-  1, /* OMP_CLAUSE_TO_DECLARE  */
+  1, /* OMP_CLAUSE_ENTER  */
   1, /* OMP_CLAUSE_LINK  */
   1, /* OMP_CLAUSE_DETACH  */
   1, /* OMP_CLAUSE_USE_DEVICE_PTR  */
@@ -370,7 +370,7 @@ const char * const omp_clause_code_name[
   "depend",
   "nontemporal",
   "uniform",
-  "to",
+  "enter",
   "link",
   "detach",
   "use_device_ptr",
--- gcc/tree-pretty-print.cc.jj 2022-05-27 11:29:15.909811326 +0200
+++ gcc/tree-pretty-print.cc    2022-05-27 11:47:00.251820423 +0200
@@ -517,8 +517,11 @@ dump_omp_clause (pretty_printer *pp, tre
     case OMP_CLAUSE__SCANTEMP_:
       name = "_scantemp_";
       goto print_remap;
-    case OMP_CLAUSE_TO_DECLARE:
-      name = "to";
+    case OMP_CLAUSE_ENTER:
+      if (OMP_CLAUSE_ENTER_TO (clause))
+       name = "to";
+      else
+       name = "enter";
       goto print_remap;
     case OMP_CLAUSE_LINK:
       name = "link";
--- gcc/tree-nested.cc.jj       2022-05-27 11:29:15.844811997 +0200
+++ gcc/tree-nested.cc  2022-05-27 11:47:00.238820558 +0200
@@ -1335,7 +1335,7 @@ convert_nonlocal_omp_clauses (tree *pcla
        case OMP_CLAUSE_FIRSTPRIVATE:
        case OMP_CLAUSE_COPYPRIVATE:
        case OMP_CLAUSE_SHARED:
-       case OMP_CLAUSE_TO_DECLARE:
+       case OMP_CLAUSE_ENTER:
        case OMP_CLAUSE_LINK:
        case OMP_CLAUSE_USE_DEVICE_PTR:
        case OMP_CLAUSE_USE_DEVICE_ADDR:
@@ -2120,7 +2120,7 @@ convert_local_omp_clauses (tree *pclause
        case OMP_CLAUSE_FIRSTPRIVATE:
        case OMP_CLAUSE_COPYPRIVATE:
        case OMP_CLAUSE_SHARED:
-       case OMP_CLAUSE_TO_DECLARE:
+       case OMP_CLAUSE_ENTER:
        case OMP_CLAUSE_LINK:
        case OMP_CLAUSE_USE_DEVICE_PTR:
        case OMP_CLAUSE_USE_DEVICE_ADDR:
--- gcc/c-family/c-pragma.h.jj  2022-05-27 11:29:15.278817842 +0200
+++ gcc/c-family/c-pragma.h     2022-05-27 11:47:00.250820434 +0200
@@ -90,7 +90,7 @@ enum pragma_kind {
 
 
 /* All clauses defined by OpenACC 2.0, and OpenMP 2.5, 3.0, 3.1, 4.0, 4.5, 5.0,
-   and 5.1.  Used internally by both C and C++ parsers.  */
+   5.1 and 5.2.  Used internally by both C and C++ parsers.  */
 enum pragma_omp_clause {
   PRAGMA_OMP_CLAUSE_NONE = 0,
 
@@ -108,6 +108,7 @@ enum pragma_omp_clause {
   PRAGMA_OMP_CLAUSE_DEVICE,
   PRAGMA_OMP_CLAUSE_DEVICE_TYPE,
   PRAGMA_OMP_CLAUSE_DIST_SCHEDULE,
+  PRAGMA_OMP_CLAUSE_ENTER,
   PRAGMA_OMP_CLAUSE_FILTER,
   PRAGMA_OMP_CLAUSE_FINAL,
   PRAGMA_OMP_CLAUSE_FIRSTPRIVATE,
--- gcc/c/c-parser.cc.jj        2022-05-27 11:29:15.368816913 +0200
+++ gcc/c/c-parser.cc   2022-05-27 11:47:00.250820434 +0200
@@ -12771,6 +12771,10 @@ c_parser_omp_clause_name (c_parser *pars
          else if (!strcmp ("dist_schedule", p))
            result = PRAGMA_OMP_CLAUSE_DIST_SCHEDULE;
          break;
+       case 'e':
+         if (!strcmp ("enter", p))
+           result = PRAGMA_OMP_CLAUSE_ENTER;
+         break;
        case 'f':
          if (!strcmp ("filter", p))
            result = PRAGMA_OMP_CLAUSE_FILTER;
@@ -17055,9 +17059,13 @@ c_parser_omp_all_clauses (c_parser *pars
          break;
        case PRAGMA_OMP_CLAUSE_TO:
          if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINK)) != 0)
-           clauses
-             = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_TO_DECLARE,
-                                             clauses);
+           {
+             tree nl = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ENTER,
+                                                     clauses);
+             for (tree c = nl; c != clauses; c = OMP_CLAUSE_CHAIN (c))
+               OMP_CLAUSE_ENTER_TO (c) = 1;
+             clauses = nl;
+           }
          else
            clauses = c_parser_omp_clause_to (parser, clauses);
          c_name = "to";
@@ -17158,6 +17166,12 @@ c_parser_omp_all_clauses (c_parser *pars
                                               clauses);
          c_name = "simd";
          break;
+       case PRAGMA_OMP_CLAUSE_ENTER:
+         clauses
+           = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ENTER,
+                                           clauses);
+         c_name = "enter";
+         break;
        default:
          c_parser_error (parser, "expected %<#pragma omp%> clause");
          goto saw_error;
@@ -22006,6 +22020,7 @@ c_finish_omp_declare_simd (c_parser *par
 
 #define OMP_DECLARE_TARGET_CLAUSE_MASK                         \
        ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TO)           \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ENTER)        \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINK)         \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE_TYPE))
 
@@ -22020,7 +22035,7 @@ c_parser_omp_declare_target (c_parser *p
                                        "#pragma omp declare target");
   else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
     {
-      clauses = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_TO_DECLARE,
+      clauses = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ENTER,
                                              clauses);
       clauses = c_finish_omp_clauses (clauses, C_ORT_OMP);
       c_parser_skip_to_pragma_eol (parser);
--- gcc/c/c-typeck.cc.jj        2022-05-27 11:29:15.447816097 +0200
+++ gcc/c/c-typeck.cc   2022-05-27 11:47:00.248820455 +0200
@@ -15248,37 +15248,40 @@ c_finish_omp_clauses (tree clauses, enum
            }
          break;
 
-       case OMP_CLAUSE_TO_DECLARE:
+       case OMP_CLAUSE_ENTER:
        case OMP_CLAUSE_LINK:
          t = OMP_CLAUSE_DECL (c);
+         const char *cname;
+         cname = omp_clause_code_name[OMP_CLAUSE_CODE (c)];
+         if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_ENTER
+             && OMP_CLAUSE_ENTER_TO (c))
+           cname = "to";
          if (TREE_CODE (t) == FUNCTION_DECL
-             && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO_DECLARE)
+             && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_ENTER)
            ;
          else if (!VAR_P (t))
            {
-             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO_DECLARE)
+             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_ENTER)
                error_at (OMP_CLAUSE_LOCATION (c),
                          "%qE is neither a variable nor a function name in "
-                         "clause %qs", t,
-                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+                         "clause %qs", t, cname);
              else
                error_at (OMP_CLAUSE_LOCATION (c),
-                         "%qE is not a variable in clause %qs", t,
-                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+                         "%qE is not a variable in clause %qs", t, cname);
              remove = true;
            }
          else if (DECL_THREAD_LOCAL_P (t))
            {
              error_at (OMP_CLAUSE_LOCATION (c),
                        "%qD is threadprivate variable in %qs clause", t,
-                       omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+                       cname);
              remove = true;
            }
          else if (!lang_hooks.types.omp_mappable_type (TREE_TYPE (t)))
            {
              error_at (OMP_CLAUSE_LOCATION (c),
                        "%qD does not have a mappable type in %qs clause", t,
-                       omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+                       cname);
              remove = true;
            }
          if (remove)
--- gcc/cp/parser.cc.jj 2022-05-27 11:29:49.279466733 +0200
+++ gcc/cp/parser.cc    2022-05-27 11:47:00.245820486 +0200
@@ -36498,6 +36498,10 @@ cp_parser_omp_clause_name (cp_parser *pa
          else if (!strcmp ("dist_schedule", p))
            result = PRAGMA_OMP_CLAUSE_DIST_SCHEDULE;
          break;
+       case 'e':
+         if (!strcmp ("enter", p))
+           result = PRAGMA_OMP_CLAUSE_ENTER;
+         break;
        case 'f':
          if (!strcmp ("filter", p))
            result = PRAGMA_OMP_CLAUSE_FILTER;
@@ -40418,8 +40422,13 @@ cp_parser_omp_all_clauses (cp_parser *pa
          break;
        case PRAGMA_OMP_CLAUSE_TO:
          if ((mask & (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINK)) != 0)
-           clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_TO_DECLARE,
-                                             clauses);
+           {
+             tree nl = cp_parser_omp_var_list (parser, OMP_CLAUSE_ENTER,
+                                               clauses);
+             for (tree c = nl; c != clauses; c = OMP_CLAUSE_CHAIN (c))
+               OMP_CLAUSE_ENTER_TO (c) = 1;
+             clauses = nl;
+           }
          else
            clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_TO, clauses,
                                              true);
@@ -40526,6 +40535,11 @@ cp_parser_omp_all_clauses (cp_parser *pa
                                                clauses, token->location);
          c_name = "simd";
          break;
+       case PRAGMA_OMP_CLAUSE_ENTER:
+         clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_ENTER,
+                                           clauses);
+         c_name = "enter";
+         break;
        default:
          cp_parser_error (parser, "expected %<#pragma omp%> clause");
          goto saw_error;
@@ -46037,6 +46051,7 @@ handle_omp_declare_target_clause (tree c
 
 #define OMP_DECLARE_TARGET_CLAUSE_MASK                         \
        ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TO)           \
+       | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_ENTER)        \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_LINK)         \
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE_TYPE))
 
@@ -46056,7 +46071,7 @@ cp_parser_omp_declare_target (cp_parser
                                   "#pragma omp declare target", pragma_tok);
   else if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
     {
-      clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_TO_DECLARE,
+      clauses = cp_parser_omp_var_list (parser, OMP_CLAUSE_ENTER,
                                        clauses);
       clauses = finish_omp_clauses (clauses, C_ORT_OMP);
       cp_parser_require_pragma_eol (parser, pragma_tok);
--- gcc/cp/semantics.cc.jj      2022-05-27 11:29:15.675813742 +0200
+++ gcc/cp/semantics.cc 2022-05-27 11:47:00.240820538 +0200
@@ -8341,48 +8341,50 @@ finish_omp_clauses (tree clauses, enum c
            }
          break;
 
-       case OMP_CLAUSE_TO_DECLARE:
+       case OMP_CLAUSE_ENTER:
        case OMP_CLAUSE_LINK:
          t = OMP_CLAUSE_DECL (c);
+         const char *cname;
+         cname = omp_clause_code_name[OMP_CLAUSE_CODE (c)];
+         if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_ENTER
+             && OMP_CLAUSE_ENTER_TO (c))
+           cname = "to";
          if (TREE_CODE (t) == FUNCTION_DECL
-             && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO_DECLARE)
+             && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_ENTER)
            ;
          else if (!VAR_P (t))
            {
-             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO_DECLARE)
+             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_ENTER)
                {
                  if (TREE_CODE (t) == TEMPLATE_ID_EXPR)
                    error_at (OMP_CLAUSE_LOCATION (c),
-                             "template %qE in clause %qs", t,
-                             omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+                             "template %qE in clause %qs", t, cname);
                  else if (really_overloaded_fn (t))
                    error_at (OMP_CLAUSE_LOCATION (c),
                              "overloaded function name %qE in clause %qs", t,
-                             omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+                             cname);
                  else
                    error_at (OMP_CLAUSE_LOCATION (c),
                              "%qE is neither a variable nor a function name "
-                             "in clause %qs", t,
-                             omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+                             "in clause %qs", t, cname);
                }
              else
                error_at (OMP_CLAUSE_LOCATION (c),
-                         "%qE is not a variable in clause %qs", t,
-                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+                         "%qE is not a variable in clause %qs", t, cname);
              remove = true;
            }
          else if (DECL_THREAD_LOCAL_P (t))
            {
              error_at (OMP_CLAUSE_LOCATION (c),
                        "%qD is threadprivate variable in %qs clause", t,
-                       omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+                       cname);
              remove = true;
            }
          else if (!cp_omp_mappable_type (TREE_TYPE (t)))
            {
              error_at (OMP_CLAUSE_LOCATION (c),
                        "%qD does not have a mappable type in %qs clause", t,
-                       omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
+                       cname);
              cp_omp_emit_unmappable_type_notes (TREE_TYPE (t));
              remove = true;
            }
--- gcc/testsuite/c-c++-common/gomp/clauses-3.c.jj      2020-01-12 
11:54:37.012404372 +0100
+++ gcc/testsuite/c-c++-common/gomp/clauses-3.c 2022-05-27 11:59:45.430896866 
+0200
@@ -3,6 +3,8 @@ struct S { int *s; char u; struct T v; l
 
 void bar (int *);
 #pragma omp declare target to (bar)
+void baz (int *);
+#pragma omp declare target enter (baz)
 
 int
 main ()
@@ -18,6 +20,6 @@ main ()
   #pragma omp target map (s.s[0]) map (s.v.b[:3])
   ;
   #pragma omp target map (s.s[0]) map (s.v.b[:3])
-  bar (s.s);
+  baz (s.s);
   return 0;
 }
--- gcc/testsuite/c-c++-common/gomp/declare-target-1.c.jj       2020-01-12 
11:54:37.012404372 +0100
+++ gcc/testsuite/c-c++-common/gomp/declare-target-1.c  2022-05-27 
12:00:03.903705311 +0200
@@ -10,4 +10,4 @@ long c;
 #pragma omp end declare target
 
 #pragma omp declare target (bar, a)
-#pragma omp declare target to (b) link (d) to (foo)
+#pragma omp declare target to (b) link (d) enter (foo)
--- gcc/testsuite/c-c++-common/gomp/declare-target-2.c.jj       2020-01-12 
11:54:37.012404372 +0100
+++ gcc/testsuite/c-c++-common/gomp/declare-target-2.c  2022-05-27 
12:03:33.651530321 +0200
@@ -7,6 +7,7 @@ extern int a;
 #pragma omp end declare target
 int b;
 #pragma omp declare target to (b) link (b)     /* { dg-error "appears more 
than once on the same .declare target. directive" } */
+#pragma omp declare target enter (b) link (b)  /* { dg-error "appears more 
than once on the same .declare target. directive" } */
 int c;
 #pragma omp declare target (c)
 #pragma omp declare target link (c)            /* { dg-error "specified both 
in declare target" } */
@@ -32,9 +33,13 @@ int m;
 #pragma omp declare target to (k)
 #pragma omp declare target (k)
 #pragma omp declare target to (k, m) link (l)
+#pragma omp declare target enter (k, m) link (l)
 #pragma omp declare target link (l)
 int n, o, s, t;
 #pragma omp declare target to (n) to (n)       /* { dg-error "appears more 
than once on the same .declare target. directive" } */
+#pragma omp declare target enter (n) enter (n) /* { dg-error "appears more 
than once on the same .declare target. directive" } */
+#pragma omp declare target enter (n) to (n)    /* { dg-error "appears more 
than once on the same .declare target. directive" } */
+#pragma omp declare target to (n) enter (n)    /* { dg-error "appears more 
than once on the same .declare target. directive" } */
 #pragma omp declare target link (o, o)         /* { dg-error "appears more 
than once on the same .declare target. directive" } */
 #pragma omp declare target (s, t, s)           /* { dg-error "appears more 
than once on the same .declare target. directive" } */
 int p, q, r;
--- gcc/testsuite/c-c++-common/gomp/declare-target-3.c.jj       2020-01-12 
11:54:37.012404372 +0100
+++ gcc/testsuite/c-c++-common/gomp/declare-target-3.c  2022-05-27 
12:37:12.891601614 +0200
@@ -15,10 +15,13 @@ extern int f[];
 #pragma omp declare target to (f) /* { dg-error "'f' does not have a mappable 
type in 'to' clause" } */
 extern int g[];
 #pragma omp declare target to (g) /* { dg-error "'g' does not have a mappable 
type in 'to' clause" } */
+extern int g2[];
+#pragma omp declare target enter (g2) /* { dg-error "'g2' does not have a 
mappable type in 'enter' clause" } */
 int g[3];
 extern int h[];
 int h[3];
 #pragma omp declare target to (h)
+#pragma omp declare target enter (h)
 
 int i[] = { 1, 2, 3 };
 int j[] = { 1, 2, 3 };
--- gcc/testsuite/g++.dg/gomp/attrs-9.C.jj      2021-08-19 17:07:48.141927011 
+0200
+++ gcc/testsuite/g++.dg/gomp/attrs-9.C 2022-05-27 12:14:13.987890317 +0200
@@ -6,8 +6,8 @@ int a;
 [[omp::directive (declare target (a))]];
 int t;
 [[omp::sequence (omp::directive (threadprivate (t)))]];
-int b, c;
-[[omp::directive (declare target, to (b), link (c))]];
+int b, c, e;
+[[omp::directive (declare target, to (b), link (c), enter (e))]];
 [[omp::directive (declare target)]];
 [[omp::directive (declare target)]];
 int d;
--- gcc/testsuite/g++.dg/gomp/declare-target-1.C.jj     2020-01-12 
11:54:37.177401882 +0100
+++ gcc/testsuite/g++.dg/gomp/declare-target-1.C        2022-05-27 
12:42:21.280410003 +0200
@@ -16,6 +16,7 @@ void f5 (T);
 #pragma omp declare target (f3)
 #pragma omp declare target to (f4)     // { dg-error "overloaded function name 
.f4. in clause .to." }
 #pragma omp declare target to (f5<int>)        // { dg-error "template 
.f5<int>. in clause .to." }
+#pragma omp declare target enter (f5<short>) // { dg-error "template .f5<short 
int>. in clause .enter." }
 template <int N>
 void f6 (int)
 {
@@ -35,3 +36,7 @@ int v;
 #pragma omp declare target (N::M::f7)
 #pragma omp declare target to (::N::f8)
 #pragma omp declare target to (::f9) to (::v)
+#pragma omp declare target to (::f9, ::v)
+#pragma omp declare target enter (::N::f8)
+#pragma omp declare target enter (::f9) enter (::v)
+#pragma omp declare target enter (::f9, ::v)
--- libgomp/testsuite/libgomp.c-c++-common/target-40.c.jj       2020-07-28 
15:39:10.150754275 +0200
+++ libgomp/testsuite/libgomp.c-c++-common/target-40.c  2022-05-27 
12:17:12.072043662 +0200
@@ -18,7 +18,7 @@ int a = 1;
 int *b = &a;
 int **c = &b;
 fnp2 f5 (void) { f3 (); return f4; }
-#pragma omp declare target to (c)
+#pragma omp declare target enter (c)
 
 int
 main ()
--- libgomp/testsuite/libgomp.c/target-41.c.jj  2020-10-22 09:36:18.165593710 
+0200
+++ libgomp/testsuite/libgomp.c/target-41.c     2022-05-27 12:17:43.602716707 
+0200
@@ -11,7 +11,7 @@ foo (void)
   v++;
 }
 
-#pragma omp declare target to (v, foo)
+#pragma omp declare target enter (v, foo)
 
 int
 main ()


        Jakub

Reply via email to