]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/88203 (assert does not compile with OpenMP's pragma omp parallel...
authorJakub Jelinek <jakub@redhat.com>
Mon, 21 Oct 2019 11:44:53 +0000 (13:44 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 21 Oct 2019 11:44:53 +0000 (13:44 +0200)
Backported from mainline
2019-09-27  Jakub Jelinek  <jakub@redhat.com>

PR c++/88203
* c-common.h (c_omp_predefined_variable): Declare.
* c-omp.c (c_omp_predefined_variable): New function.
(c_omp_predetermined_sharing): Return OMP_CLAUSE_DEFAULT_SHARED
for predefined variables.

* c-parser.c (c_parser_predefined_identifier): New function.
(c_parser_postfix_expression): Use it.
(c_parser_omp_variable_list): Parse predefined identifiers.
* c-typeck.c (c_finish_omp_clauses): Allow predefined variables
in shared and firstprivate clauses, even when they are predetermined
shared.

* parser.c (cp_parser_omp_var_list_no_open): Parse predefined
variables.
* semantics.c (finish_omp_clauses): Allow predefined variables in
shared and firstprivate clauses, even when they are predetermined
shared.
* cp-gimplify.c (cxx_omp_predetermined_sharing_1): Return
OMP_CLAUSE_DEFAULT_SHARED for predefined variables.

* c-c++-common/gomp/pr88203-1.c: New test.
* c-c++-common/gomp/pr88203-2.c: New test.
* c-c++-common/gomp/pr88203-3.c: New test.

From-SVN: r277253

14 files changed:
gcc/c-family/ChangeLog
gcc/c-family/c-common.h
gcc/c-family/c-omp.c
gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/c/c-typeck.c
gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/cp/parser.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/pr88203-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/pr88203-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/pr88203-3.c [new file with mode: 0644]

index 7f786dfdfcd0d7eee9497e31af3ea673d2e9dcb6..baffbb13d6c69e738e81fb7a4426a20cbcd636b9 100644 (file)
@@ -1,3 +1,14 @@
+2019-10-21  Jakub Jelinek  <jakub@redhat.com>
+
+       Backported from mainline
+       2019-09-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/88203
+       * c-common.h (c_omp_predefined_variable): Declare.
+       * c-omp.c (c_omp_predefined_variable): New function.
+       (c_omp_predetermined_sharing): Return OMP_CLAUSE_DEFAULT_SHARED
+       for predefined variables.
+
 2019-09-02  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
index 1cf2cae63951ede2ab14c258c62120655f523829..e9ef16aff29e6a1010ad2f3711769e1f8a6fb247 100644 (file)
@@ -1184,6 +1184,7 @@ extern void c_omp_split_clauses (location_t, enum tree_code, omp_clause_mask,
                                 tree, tree *);
 extern tree c_omp_declare_simd_clauses_to_numbers (tree, tree);
 extern void c_omp_declare_simd_clauses_to_decls (tree, tree);
+extern bool c_omp_predefined_variable (tree);
 extern enum omp_clause_default_kind c_omp_predetermined_sharing (tree);
 
 /* Return next tree in the chain for chain_next walking of tree nodes.  */
index 1f288a6fbb21f4bc8c56e7eb622e02e9dbf46077..ebe0b4e81559aa13c4518ba0cf8273dd9b7f325a 100644 (file)
@@ -2023,6 +2023,25 @@ c_omp_declare_simd_clauses_to_decls (tree fndecl, tree clauses)
       }
 }
 
+/* Return true for __func__ and similar function-local predefined
+   variables (which are in OpenMP predetermined shared, allowed in
+   shared/firstprivate clauses).  */
+
+bool
+c_omp_predefined_variable (tree decl)
+{
+  if (VAR_P (decl)
+      && DECL_ARTIFICIAL (decl)
+      && TREE_READONLY (decl)
+      && TREE_STATIC (decl)
+      && DECL_NAME (decl)
+      && (DECL_NAME (decl) == ridpointers[RID_C99_FUNCTION_NAME]
+         || DECL_NAME (decl) == ridpointers[RID_FUNCTION_NAME]
+         || DECL_NAME (decl) == ridpointers[RID_PRETTY_FUNCTION_NAME]))
+    return true;
+  return false;
+}
+
 /* True if OpenMP sharing attribute of DECL is predetermined.  */
 
 enum omp_clause_default_kind
@@ -2036,5 +2055,8 @@ c_omp_predetermined_sharing (tree decl)
       && INTEGRAL_TYPE_P (TREE_TYPE (decl)))
     return OMP_CLAUSE_DEFAULT_SHARED;
 
+  if (c_omp_predefined_variable (decl))
+    return OMP_CLAUSE_DEFAULT_SHARED;
+
   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
 }
index 744ab614ce5b4a347e337de439d6a0e5c6413998..126a51e5748d0954c7bed806af9d1bfc941c1025 100644 (file)
@@ -1,6 +1,16 @@
 2019-10-21  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2019-09-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/88203
+       * c-parser.c (c_parser_predefined_identifier): New function.
+       (c_parser_postfix_expression): Use it.
+       (c_parser_omp_variable_list): Parse predefined identifiers.
+       * c-typeck.c (c_finish_omp_clauses): Allow predefined variables
+       in shared and firstprivate clauses, even when they are predetermined
+       shared.
+
        2019-08-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/91401
index fe6c82612a2457d16beb6eb693781fc7bf6b8420..aafe8d1740bc3f63f7595226e82ad31ef45ae951 100644 (file)
@@ -8012,6 +8012,41 @@ enum tgmath_parm_kind
     tgmath_fixed, tgmath_real, tgmath_complex
   };
 
+/* Helper function for c_parser_postfix_expression.  Parse predefined
+   identifiers.  */
+
+static struct c_expr
+c_parser_predefined_identifier (c_parser *parser)
+{
+  location_t loc = c_parser_peek_token (parser)->location;
+  switch (c_parser_peek_token (parser)->keyword)
+    {
+    case RID_FUNCTION_NAME:
+      pedwarn (loc, OPT_Wpedantic, "ISO C does not support %qs predefined "
+              "identifier", "__FUNCTION__");
+      break;
+    case RID_PRETTY_FUNCTION_NAME:
+      pedwarn (loc, OPT_Wpedantic, "ISO C does not support %qs predefined "
+              "identifier", "__PRETTY_FUNCTION__");
+      break;
+    case RID_C99_FUNCTION_NAME:
+      pedwarn_c90 (loc, OPT_Wpedantic, "ISO C90 does not support "
+                  "%<__func__%> predefined identifier");
+      break;
+    default:
+      gcc_unreachable ();
+    }
+
+  struct c_expr expr;
+  expr.original_code = ERROR_MARK;
+  expr.original_type = NULL;
+  expr.value = fname_decl (loc, c_parser_peek_token (parser)->keyword,
+                          c_parser_peek_token (parser)->value);
+  set_c_expr_source_range (&expr, loc, loc);
+  c_parser_consume_token (parser);
+  return expr;
+}
+
 /* Parse a postfix expression (C90 6.3.1-6.3.2, C99 6.5.1-6.5.2,
    C11 6.5.1-6.5.2).  Compound literals aren't handled here; callers have to
    call c_parser_postfix_expression_after_paren_type on encountering them.
@@ -8232,31 +8267,9 @@ c_parser_postfix_expression (c_parser *parser)
       switch (c_parser_peek_token (parser)->keyword)
        {
        case RID_FUNCTION_NAME:
-         pedwarn (loc, OPT_Wpedantic,  "ISO C does not support "
-                  "%<__FUNCTION__%> predefined identifier");
-         expr.value = fname_decl (loc,
-                                  c_parser_peek_token (parser)->keyword,
-                                  c_parser_peek_token (parser)->value);
-         set_c_expr_source_range (&expr, loc, loc);
-         c_parser_consume_token (parser);
-         break;
        case RID_PRETTY_FUNCTION_NAME:
-         pedwarn (loc, OPT_Wpedantic,  "ISO C does not support "
-                  "%<__PRETTY_FUNCTION__%> predefined identifier");
-         expr.value = fname_decl (loc,
-                                  c_parser_peek_token (parser)->keyword,
-                                  c_parser_peek_token (parser)->value);
-         set_c_expr_source_range (&expr, loc, loc);
-         c_parser_consume_token (parser);
-         break;
        case RID_C99_FUNCTION_NAME:
-         pedwarn_c90 (loc, OPT_Wpedantic,  "ISO C90 does not support "
-                  "%<__func__%> predefined identifier");
-         expr.value = fname_decl (loc,
-                                  c_parser_peek_token (parser)->keyword,
-                                  c_parser_peek_token (parser)->value);
-         set_c_expr_source_range (&expr, loc, loc);
-         c_parser_consume_token (parser);
+         expr = c_parser_predefined_identifier (parser);
          break;
        case RID_VA_ARG:
          {
@@ -11950,15 +11963,9 @@ c_parser_omp_variable_list (c_parser *parser,
 {
   auto_vec<c_token> tokens;
   unsigned int tokens_avail = 0;
+  bool first = true;
 
-  if (kind != OMP_CLAUSE_DEPEND
-      && (c_parser_next_token_is_not (parser, CPP_NAME)
-         || c_parser_peek_token (parser)->id_kind != C_ID_ID))
-    c_parser_error (parser, "expected identifier");
-
-  while (kind == OMP_CLAUSE_DEPEND
-        || (c_parser_next_token_is (parser, CPP_NAME)
-            && c_parser_peek_token (parser)->id_kind == C_ID_ID))
+  while (1)
     {
       bool array_section_p = false;
       if (kind == OMP_CLAUSE_DEPEND)
@@ -11979,6 +11986,7 @@ c_parser_omp_variable_list (c_parser *parser,
                break;
 
              c_parser_consume_token (parser);
+             first = false;
              continue;
            }
 
@@ -12029,16 +12037,35 @@ c_parser_omp_variable_list (c_parser *parser,
          parser->tokens_avail = tokens.length ();
        }
 
-      tree t = lookup_name (c_parser_peek_token (parser)->value);
+      tree t = NULL_TREE;
 
-      if (t == NULL_TREE)
+      if (c_parser_next_token_is (parser, CPP_NAME)
+         && c_parser_peek_token (parser)->id_kind == C_ID_ID)
        {
-         undeclared_variable (c_parser_peek_token (parser)->location,
-                              c_parser_peek_token (parser)->value);
-         t = error_mark_node;
-       }
+         t = lookup_name (c_parser_peek_token (parser)->value);
 
-      c_parser_consume_token (parser);
+         if (t == NULL_TREE)
+           {
+             undeclared_variable (c_parser_peek_token (parser)->location,
+             c_parser_peek_token (parser)->value);
+             t = error_mark_node;
+           }
+
+         c_parser_consume_token (parser);
+       }
+      else if (c_parser_next_token_is (parser, CPP_KEYWORD)
+              && (c_parser_peek_token (parser)->keyword == RID_FUNCTION_NAME
+                  || (c_parser_peek_token (parser)->keyword
+                      == RID_PRETTY_FUNCTION_NAME)
+                  || (c_parser_peek_token (parser)->keyword
+                      == RID_C99_FUNCTION_NAME)))
+       t = c_parser_predefined_identifier (parser).value;
+      else
+       {
+         if (first)
+           c_parser_error (parser, "expected identifier");
+         break;
+       }
 
       if (t == error_mark_node)
        ;
@@ -12176,6 +12203,7 @@ c_parser_omp_variable_list (c_parser *parser,
        break;
 
       c_parser_consume_token (parser);
+      first = false;
     }
 
   return list;
index 4a4eb08b73f94984d036a2792647fec67f641fcd..be12a0a605e18a4f39ea2e81f025c8a67cc8d899 100644 (file)
@@ -14713,6 +14713,13 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
                case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
                  break;
                case OMP_CLAUSE_DEFAULT_SHARED:
+                 if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED
+                      || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE)
+                     && c_omp_predefined_variable (t))
+                   /* The __func__ variable and similar function-local
+                      predefined variables may be listed in a shared or
+                      firstprivate clause.  */
+                   break;
                  share_name = "shared";
                  break;
                case OMP_CLAUSE_DEFAULT_PRIVATE:
index f6de950dcb4a221f0aa911e935517415e942abf5..21e54a597af7caf17a53f1b42a6ea67c3aff4390 100644 (file)
@@ -1,6 +1,17 @@
 2019-10-21  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2019-09-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/88203
+       * parser.c (cp_parser_omp_var_list_no_open): Parse predefined
+       variables.
+       * semantics.c (finish_omp_clauses): Allow predefined variables in
+       shared and firstprivate clauses, even when they are predetermined
+       shared.
+       * cp-gimplify.c (cxx_omp_predetermined_sharing_1): Return
+       OMP_CLAUSE_DEFAULT_SHARED for predefined variables.
+
        2019-08-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/91401
index 17d10456341b712e84e7aaf9fa16f9f7ff912da6..208892b9318d9d2558188350d18a283fccda2ca8 100644 (file)
@@ -2050,6 +2050,9 @@ cxx_omp_predetermined_sharing_1 (tree decl)
       tree ctx = CP_DECL_CONTEXT (decl);
       if (TYPE_P (ctx) && MAYBE_CLASS_TYPE_P (ctx))
        return OMP_CLAUSE_DEFAULT_SHARED;
+
+      if (c_omp_predefined_variable (decl))
+       return OMP_CLAUSE_DEFAULT_SHARED;
     }
 
   /* this may not be specified in data-sharing clauses, still we need
index c9971921e5d38c9778125c75232aeaac79c6977c..3fac495d293e738700947901f69f7df7feb1d618 100644 (file)
@@ -32468,6 +32468,14 @@ cp_parser_omp_var_list_no_open (cp_parser *parser, enum omp_clause_code kind,
            decl = TREE_OPERAND (decl, 0);
          cp_lexer_consume_token (parser->lexer);
        }
+      else if (cp_parser_is_keyword (token, RID_FUNCTION_NAME)
+              || cp_parser_is_keyword (token, RID_PRETTY_FUNCTION_NAME)
+              || cp_parser_is_keyword (token, RID_C99_FUNCTION_NAME))
+       {
+         cp_id_kind idk;
+         decl = cp_parser_primary_expression (parser, false, false, false,
+                                              &idk);
+       }
       else
        {
          name = cp_parser_id_expression (parser, /*template_p=*/false,
index 6d40b145fcb9fa4e113d37a1646bc51de0b65405..ebfdf9a47b0ce29304e804b59f13ce18107d61ea 100644 (file)
@@ -7790,6 +7790,13 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
            case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
              break;
            case OMP_CLAUSE_DEFAULT_SHARED:
+             if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED
+                  || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE)
+                 && c_omp_predefined_variable (t))
+               /* The __func__ variable and similar function-local predefined
+                  variables may be listed in a shared or firstprivate
+                  clause.  */
+               break;
              if (VAR_P (t)
                  && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
                  && TREE_STATIC (t)
index 01b45cca48e17e75c0e192349f93b7013a9308c7..494f0aded36482e7acc577c6777a862dbe07bbfa 100644 (file)
@@ -3,6 +3,11 @@
        Backported from mainline
        2019-09-27  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/88203
+       * c-c++-common/gomp/pr88203-1.c: New test.
+       * c-c++-common/gomp/pr88203-2.c: New test.
+       * c-c++-common/gomp/pr88203-3.c: New test.
+
        PR middle-end/91920
        * c-c++-common/gomp/pr91920.c: New test.
 
diff --git a/gcc/testsuite/c-c++-common/gomp/pr88203-1.c b/gcc/testsuite/c-c++-common/gomp/pr88203-1.c
new file mode 100644 (file)
index 0000000..54a6864
--- /dev/null
@@ -0,0 +1,61 @@
+/* PR c++/88203 */
+/* { dg-do compile } */
+/* { dg-additional-options "-std=c99" { target c } } */
+/* { dg-additional-options "-std=c++11" { target c++ } } */
+
+void foo (const char *);
+#pragma omp declare target to (foo)
+
+void
+f1 (void)
+{
+  #pragma omp parallel default(none)
+  foo (__func__);
+}
+
+void
+f2 (void)
+{
+  #pragma omp parallel default(none) shared(__func__)
+  foo (__func__);
+}
+
+void
+f3 (void)
+{
+  #pragma omp parallel default(none) firstprivate(__func__)
+  foo (__func__);
+}
+
+void
+f4 (void)
+{
+  foo (__func__);
+  #pragma omp parallel default(none)
+  foo (__func__);
+}
+
+void
+f5 (void)
+{
+  foo (__func__);
+  #pragma omp parallel default(none) shared(__func__)
+  foo (__func__);
+}
+
+void
+f6 (void)
+{
+  foo (__func__);
+  #pragma omp parallel default(none) firstprivate(__func__)
+  foo (__func__);
+}
+
+void
+f7 (void)
+{
+  #pragma omp target map(to: __func__)
+  foo (__func__);
+  #pragma omp task depend(inout:__func__)
+  foo (__func__);
+}
diff --git a/gcc/testsuite/c-c++-common/gomp/pr88203-2.c b/gcc/testsuite/c-c++-common/gomp/pr88203-2.c
new file mode 100644 (file)
index 0000000..90c4a72
--- /dev/null
@@ -0,0 +1,65 @@
+/* PR c++/88203 */
+/* { dg-do compile } */
+/* { dg-additional-options "-std=gnu99" { target c } } */
+/* { dg-additional-options "-std=gnu++11" { target c++ } } */
+
+void foo (const char *, const char *);
+#pragma omp declare target to (foo)
+
+void
+f1 (void)
+{
+  #pragma omp parallel default(none)
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+}
+
+void
+f2 (void)
+{
+  #pragma omp parallel default(none) shared(__FUNCTION__, __PRETTY_FUNCTION__)
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+  #pragma omp parallel default(none) shared(__FUNCTION__) firstprivate(__PRETTY_FUNCTION__)
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+}
+
+void
+f3 (void)
+{
+  #pragma omp parallel default(none) firstprivate(__FUNCTION__, __PRETTY_FUNCTION__)
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+  #pragma omp parallel default(none) firstprivate(__FUNCTION__), shared(__PRETTY_FUNCTION__)
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+}
+
+void
+f4 (void)
+{
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+  #pragma omp parallel default(none)
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+}
+
+void
+f5 (void)
+{
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+  #pragma omp parallel default(none) shared(__FUNCTION__, __PRETTY_FUNCTION__)
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+}
+
+void
+f6 (void)
+{
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+  #pragma omp parallel default(none) firstprivate(__FUNCTION__, __PRETTY_FUNCTION__)
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+}
+
+void
+f7 (void)
+{
+  #pragma omp target map(to: __FUNCTION__, __PRETTY_FUNCTION__)
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+  #pragma omp task depend(inout:__FUNCTION__, __PRETTY_FUNCTION__)
+  foo (__FUNCTION__, __PRETTY_FUNCTION__);
+}
diff --git a/gcc/testsuite/c-c++-common/gomp/pr88203-3.c b/gcc/testsuite/c-c++-common/gomp/pr88203-3.c
new file mode 100644 (file)
index 0000000..6a9585d
--- /dev/null
@@ -0,0 +1,28 @@
+/* PR c++/88203 */
+/* { dg-do compile } */
+/* { dg-additional-options "-std=c99" { target c } } */
+/* { dg-additional-options "-std=c++11" { target c++ } } */
+
+void foo (const char *);
+#pragma omp declare target to (foo)
+
+void
+f1 (void)
+{
+  #pragma omp parallel for lastprivate (__func__)      /* { dg-error "'__func__' is predetermined 'shared' for 'lastprivate'" } */
+  for (int i = 0; i < 2; i++)
+    foo (__func__);
+  #pragma omp parallel private (__func__)              /* { dg-error "'__func__' is predetermined 'shared' for 'private'" } */
+  foo (__func__);
+}
+
+void
+f2 (void)
+{
+  foo (__func__);
+  #pragma omp parallel default(none) private (__func__)                /* { dg-error "'__func__' is predetermined 'shared' for 'private'" } */
+  foo (__func__);
+  #pragma omp parallel for default(none) lastprivate (__func__)        /* { dg-error "'__func__' is predetermined 'shared' for 'lastprivate'" } */
+  for (int i = 0; i < 2; i++)
+    foo (__func__);
+}