After parsing the directive, 'sorry, unimplemented' is printed.
Note that restriction checks still have to be implemented, but this
depends on parser support for the 'local' clause of 'omp declare target',
which still has to be implemented.
gcc/c-family/ChangeLog:
* c-omp.cc (c_omp_directives): Uncomment 'groupprivate'.
* c-pragma.cc (omp_pragmas): Add PRAGMA_OMP_GROUPPRIVATE.
* c-pragma.h (enum pragma_kind): Likewise.
gcc/c/ChangeLog:
* c-parser.cc (OMP_GROUPPRIVATE_CLAUSE_MASK,
c_parser_omp_groupprivate): New.
(c_parser_pragma): Call it.
(c_maybe_parse_omp_decl): Uncomment PRAGMA_OMP_GROUPPRIVATE
check.
gcc/cp/ChangeLog:
* parser.cc (OMP_GROUPPRIVATE_CLAUSE_MASK,
cp_parser_omp_groupprivate): New.
(cp_parser_pragma): Call it.
(cp_maybe_parse_omp_decl): Uncomment PRAGMA_OMP_GROUPPRIVATE
check.
gcc/testsuite/ChangeLog:
* c-c++-common/gomp/groupprivate-1.c: New test.
C_OMP_DIR_CONSTRUCT, true },
/* { "fuse", nullptr, nullptr, PRAGMA_OMP_FUSE,
C_OMP_DIR_CONSTRUCT, true }, */
- /* { "groupprivate", nullptr, nullptr, PRAGMA_OMP_GROUPPRIVATE,
- C_OMP_DIR_DECLARATIVE, false }, */
+ { "groupprivate", nullptr, nullptr, PRAGMA_OMP_GROUPPRIVATE,
+ C_OMP_DIR_DECLARATIVE, false },
/* { "interchange", nullptr, nullptr, PRAGMA_OMP_INTERCHANGE,
C_OMP_DIR_CONSTRUCT, true }, */
{ "interop", nullptr, nullptr, PRAGMA_OMP_INTEROP,
{ "error", PRAGMA_OMP_ERROR },
{ "end", PRAGMA_OMP_END },
{ "flush", PRAGMA_OMP_FLUSH },
+ { "groupprivate", PRAGMA_OMP_GROUPPRIVATE },
{ "interop", PRAGMA_OMP_INTEROP },
{ "metadirective", PRAGMA_OMP_METADIRECTIVE },
{ "nothing", PRAGMA_OMP_NOTHING },
PRAGMA_OMP_END,
PRAGMA_OMP_FLUSH,
PRAGMA_OMP_FOR,
+ PRAGMA_OMP_GROUPPRIVATE,
PRAGMA_OMP_INTEROP,
PRAGMA_OMP_LOOP,
PRAGMA_OMP_NOTHING,
static void c_parser_oacc_enter_exit_data (c_parser *, bool);
static void c_parser_oacc_update (c_parser *);
static void c_parser_omp_construct (c_parser *, bool *);
+static void c_parser_omp_groupprivate (c_parser *);
static void c_parser_omp_threadprivate (c_parser *);
static void c_parser_omp_barrier (c_parser *);
static void c_parser_omp_depobj (c_parser *);
case PRAGMA_OMP_CANCELLATION_POINT:
return c_parser_omp_cancellation_point (parser, context);
+ case PRAGMA_OMP_GROUPPRIVATE:
+ c_parser_omp_groupprivate (parser);
+ return false;
+
case PRAGMA_OMP_THREADPRIVATE:
c_parser_omp_threadprivate (parser);
return false;
return false;
}
if (dir->id != PRAGMA_OMP_THREADPRIVATE
- /* && dir->id != PRAGMA_OMP_GROUPPRIVATE */
+ && dir->id != PRAGMA_OMP_GROUPPRIVATE
&& dir->id != PRAGMA_OMP_ALLOCATE
&& (dir->id != PRAGMA_OMP_DECLARE
|| strcmp (directive[1], "target") != 0))
gcc_assert (EXPR_LOCATION (stmt) != UNKNOWN_LOCATION);
}
+/* OpenMP 6.0:
+ # pragma omp groupprivate (variable-list) [device_type(...)] */
+
+#define OMP_GROUPPRIVATE_CLAUSE_MASK \
+ ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE_TYPE) )
+
+static void
+c_parser_omp_groupprivate (c_parser *parser)
+{
+ location_t loc = c_parser_peek_token (parser)->location;
+ c_parser_consume_pragma (parser);
+ tree vars = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ERROR, NULL);
+ tree clauses = c_parser_omp_all_clauses (parser, OMP_GROUPPRIVATE_CLAUSE_MASK,
+ "#pragma omp groupprivate");
+ /* TODO: Implies 'declare target local' with specified device_type, check for
+ conflicts. Check for other restrictions. */
+ (void) vars;
+ (void) clauses;
+ sorry_at (loc, "%<omp groupprivate%>");
+}
/* OpenMP 2.5:
# pragma omp threadprivate (variable-list) */
clauses);
}
+/* OpenMP 6.0:
+ # pragma omp groupprivate (variable-list) [device_type(...)] */
+
+#define OMP_GROUPPRIVATE_CLAUSE_MASK \
+ ( (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_DEVICE_TYPE) )
+
+static void
+cp_parser_omp_groupprivate (cp_parser *parser, cp_token *pragma_tok)
+{
+ location_t loc = cp_lexer_peek_token (parser->lexer)->location;
+ tree vars = cp_parser_omp_var_list (parser, OMP_CLAUSE_ERROR, NULL);
+ tree clauses = cp_parser_omp_all_clauses (parser, OMP_GROUPPRIVATE_CLAUSE_MASK,
+ "#pragma omp groupprivate", pragma_tok);
+ /* TODO: Implies 'declare target local' with specified device_type, check for
+ conflicts. Check for other restrictions. */
+ (void) vars;
+ (void) clauses;
+ sorry_at (loc, "%<omp groupprivate%>");
+}
/* OpenMP 2.5:
# pragma omp threadprivate (variable-list) */
return false;
}
if (dir->id != PRAGMA_OMP_THREADPRIVATE
- /* && dir->id != PRAGMA_OMP_GROUPPRIVATE */
+ && dir->id != PRAGMA_OMP_GROUPPRIVATE
&& dir->id != PRAGMA_OMP_ALLOCATE
&& (dir->id != PRAGMA_OMP_DECLARE
|| strcmp (directive[1], "target") != 0))
case PRAGMA_OMP_CANCELLATION_POINT:
return cp_parser_omp_cancellation_point (parser, pragma_tok, context);
+ case PRAGMA_OMP_GROUPPRIVATE:
+ cp_parser_omp_groupprivate (parser, pragma_tok);
+ return false;
+
case PRAGMA_OMP_THREADPRIVATE:
cp_parser_omp_threadprivate (parser, pragma_tok);
return false;
--- /dev/null
+/* { dg-do compile } */
+
+int x, y, z, a, b;
+#pragma omp groupprivate(a,b) // { dg-message "sorry, unimplemented: 'omp groupprivate'" }
+#pragma omp groupprivate(x) device_type(any) // { dg-message "sorry, unimplemented: 'omp groupprivate'" }
+#pragma omp groupprivate(y) device_type(host) // { dg-message "sorry, unimplemented: 'omp groupprivate'" }
+#pragma omp groupprivate(z) device_type(nohost) // { dg-message "sorry, unimplemented: 'omp groupprivate'" }
+
+[[omp::decl (groupprivate)]] int d, e; // { dg-message "sorry, unimplemented: 'omp groupprivate'" }
+[[omp::decl (groupprivate,device_type(any))]] int f1; // { dg-message "sorry, unimplemented: 'omp groupprivate'" }
+[[omp::decl (groupprivate,device_type(host))]] int f2; // { dg-message "sorry, unimplemented: 'omp groupprivate'" }
+[[omp::decl (groupprivate,device_type(nohost))]] int f3; // { dg-message "sorry, unimplemented: 'omp groupprivate'" }