re PR c/85696 (OpenMP with variably modified and default(none) won't compile)
authorJakub Jelinek <jakub@redhat.com>
Fri, 11 May 2018 07:42:50 +0000 (09:42 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 11 May 2018 07:42:50 +0000 (09:42 +0200)
PR c/85696
* c-omp.c (c_omp_predetermined_sharing): Return
OMP_CLAUSE_DEFAULT_SHARED for artificial vars with integral type.

* cp-tree.h (cxx_omp_predetermined_sharing_1): New prototype.
* cp-gimplify.c (cxx_omp_predetermined_sharing): New wrapper around
cxx_omp_predetermined_sharing_1.  Rename old function to ...
(cxx_omp_predetermined_sharing_1): ... this.
* semantics.c (finish_omp_clauses): Use cxx_omp_predetermined_sharing_1
instead of cxx_omp_predetermined_sharing.

* c-c++-common/gomp/pr85696.c: New test.

From-SVN: r260156

gcc/c-family/ChangeLog
gcc/c-family/c-omp.c
gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/cp/cp-tree.h
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/pr85696.c [new file with mode: 0644]

index d2fba2f..c38d5ec 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/85696
+       * c-omp.c (c_omp_predetermined_sharing): Return
+       OMP_CLAUSE_DEFAULT_SHARED for artificial vars with integral type.
+
 2018-05-11  Martin Liska  <mliska@suse.cz>
 
         PR sanitizer/85556
index a076e3c..d8695f5 100644 (file)
@@ -1611,5 +1611,13 @@ c_omp_predetermined_sharing (tree decl)
   if (TREE_READONLY (decl))
     return OMP_CLAUSE_DEFAULT_SHARED;
 
+  /* Predetermine artificial variables holding integral values, those
+     are usually result of gimplify_one_sizepos or SAVE_EXPR
+     gimplification.  */
+  if (VAR_P (decl)
+      && DECL_ARTIFICIAL (decl)
+      && INTEGRAL_TYPE_P (TREE_TYPE (decl)))
+    return OMP_CLAUSE_DEFAULT_SHARED;
+
   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
 }
index 920bed4..08cd81f 100644 (file)
@@ -1,3 +1,13 @@
+2018-05-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/85696
+       * cp-tree.h (cxx_omp_predetermined_sharing_1): New prototype.
+       * cp-gimplify.c (cxx_omp_predetermined_sharing): New wrapper around
+       cxx_omp_predetermined_sharing_1.  Rename old function to ...
+       (cxx_omp_predetermined_sharing_1): ... this.
+       * semantics.c (finish_omp_clauses): Use cxx_omp_predetermined_sharing_1
+       instead of cxx_omp_predetermined_sharing.
+
 2018-05-10  Jason Merrill  <jason@redhat.com>
 
        * decl.c (cp_finish_decl): Don't instantiate auto variable.
index 84882f8..317ba45 100644 (file)
@@ -1957,7 +1957,7 @@ cxx_omp_const_qual_no_mutable (tree decl)
 /* True if OpenMP sharing attribute of DECL is predetermined.  */
 
 enum omp_clause_default_kind
-cxx_omp_predetermined_sharing (tree decl)
+cxx_omp_predetermined_sharing_1 (tree decl)
 {
   /* Static data members are predetermined shared.  */
   if (TREE_STATIC (decl))
@@ -1975,6 +1975,32 @@ cxx_omp_predetermined_sharing (tree decl)
   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
 }
 
+/* Likewise, but also include the artificial vars.  We don't want to
+   disallow the artificial vars being mentioned in explicit clauses,
+   as we use artificial vars e.g. for loop constructs with random
+   access iterators other than pointers, but during gimplification
+   we want to treat them as predetermined.  */
+
+enum omp_clause_default_kind
+cxx_omp_predetermined_sharing (tree decl)
+{
+  enum omp_clause_default_kind ret = cxx_omp_predetermined_sharing_1 (decl);
+  if (ret != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
+    return ret;
+
+  /* Predetermine artificial variables holding integral values, those
+     are usually result of gimplify_one_sizepos or SAVE_EXPR
+     gimplification.  */
+  if (VAR_P (decl)
+      && DECL_ARTIFICIAL (decl)
+      && INTEGRAL_TYPE_P (TREE_TYPE (decl))
+      && !(DECL_LANG_SPECIFIC (decl)
+          && DECL_OMP_PRIVATIZED_MEMBER (decl)))
+    return OMP_CLAUSE_DEFAULT_SHARED;
+
+  return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
+}
+
 /* Finalize an implicitly determined clause.  */
 
 void
index a4e0099..353bc6a 100644 (file)
@@ -7383,6 +7383,7 @@ extern int cp_gimplify_expr                       (tree *, gimple_seq *,
                                                 gimple_seq *);
 extern void cp_genericize                      (tree);
 extern bool cxx_omp_const_qual_no_mutable      (tree);
+extern enum omp_clause_default_kind cxx_omp_predetermined_sharing_1 (tree);
 extern enum omp_clause_default_kind cxx_omp_predetermined_sharing (tree);
 extern tree cxx_omp_clause_default_ctor                (tree, tree, tree);
 extern tree cxx_omp_clause_copy_ctor           (tree, tree, tree);
index 195286c..6557817 100644 (file)
@@ -7297,7 +7297,7 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
 
          if (VAR_P (t) && CP_DECL_THREAD_LOCAL_P (t))
            share_name = "threadprivate";
-         else switch (cxx_omp_predetermined_sharing (t))
+         else switch (cxx_omp_predetermined_sharing_1 (t))
            {
            case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
              break;
index 1591122..ca16f5c 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/85696
+       * c-c++-common/gomp/pr85696.c: New test.
+
 2018-05-11  Allan Sandfeld Jensen  <allan.jensen@qt.io>
            Jakub Jelinek  <jakub@redhat.com>
 
diff --git a/gcc/testsuite/c-c++-common/gomp/pr85696.c b/gcc/testsuite/c-c++-common/gomp/pr85696.c
new file mode 100644 (file)
index 0000000..798718b
--- /dev/null
@@ -0,0 +1,20 @@
+/* PR c/85696 */
+
+#ifndef __cplusplus
+void
+foo (int n, int a[][n])
+{
+  #pragma omp parallel shared(a) default(none)
+  #pragma omp master
+    a[23][0] = 42;
+}
+#endif
+
+void
+bar (int n, void *p)
+{
+  int (*a)[n] = (int (*)[n]) p;
+  #pragma omp parallel shared(a) default(none)
+  #pragma omp master
+    a[23][0] = 42;
+}