From: Jakub Jelinek Date: Fri, 22 Jun 2018 21:25:04 +0000 (+0200) Subject: backport: re PR c/85696 (OpenMP with variably modified and default(none) won't compile) X-Git-Tag: releases/gcc-7.4.0~326 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f492b27c91433401f3f2fad73f3d972f52f1494b;p=thirdparty%2Fgcc.git backport: re PR c/85696 (OpenMP with variably modified and default(none) won't compile) Backported from mainline 2018-05-11 Jakub Jelinek PR c/85696 * c-omp.c (c_omp_predetermined_sharing): Return OMP_CLAUSE_DEFAULT_SHARED for artificial vars with integral type. * c-typeck.c (c_finish_omp_clauses): Don't use c_omp_predetermined_sharing, instead just check TREE_READONLY. * 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: r261963 --- diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index e2c7ea36b201..00653a6029da 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,6 +1,12 @@ 2018-06-22 Jakub Jelinek Backported from mainline + 2018-05-11 Jakub Jelinek + + PR c/85696 + * c-omp.c (c_omp_predetermined_sharing): Return + OMP_CLAUSE_DEFAULT_SHARED for artificial vars with integral type. + 2018-05-10 Jakub Jelinek PR c++/85662 diff --git a/gcc/c-family/c-omp.c b/gcc/c-family/c-omp.c index 977cb0ea1530..eee718ddce10 100644 --- a/gcc/c-family/c-omp.c +++ b/gcc/c-family/c-omp.c @@ -1540,5 +1540,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; } diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 9370bef39180..35f93f6ef3e6 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,6 +1,12 @@ 2018-06-22 Jakub Jelinek Backported from mainline + 2018-05-11 Jakub Jelinek + + PR c/85696 + * c-typeck.c (c_finish_omp_clauses): Don't use + c_omp_predetermined_sharing, instead just check TREE_READONLY. + 2018-05-10 Jakub Jelinek PR c++/85662 diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 2c87ec9875a7..66a58a81e71f 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -13760,22 +13760,11 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort) if (VAR_P (t) && DECL_THREAD_LOCAL_P (t)) share_name = "threadprivate"; - else switch (c_omp_predetermined_sharing (t)) + else if (TREE_READONLY (t)) { - case OMP_CLAUSE_DEFAULT_UNSPECIFIED: - break; - case OMP_CLAUSE_DEFAULT_SHARED: /* const vars may be specified in firstprivate clause. */ - if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE - && TREE_READONLY (t)) - break; - share_name = "shared"; - break; - case OMP_CLAUSE_DEFAULT_PRIVATE: - share_name = "private"; - break; - default: - gcc_unreachable (); + if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_FIRSTPRIVATE) + share_name = "shared"; } if (share_name) { diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index effd4a7b27d6..9a6c7dc9adb1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,16 @@ 2018-06-22 Jakub Jelinek Backported from mainline + 2018-05-11 Jakub Jelinek + + 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 Jakub Jelinek PR c++/85662 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 5f5274a0ce3a..4891346a609b 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -1918,7 +1918,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)) @@ -1936,6 +1936,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 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 25d404bc609c..664def604058 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -6943,6 +6943,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); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 52ca2a53efc0..34ca72e10a0a 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -7371,7 +7371,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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dd4c71e9baf3..7669f256a446 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -6,6 +6,11 @@ PR c++/85662 * g++.dg/ext/offsetof3.C: New test. + 2018-05-11 Jakub Jelinek + + PR c/85696 + * c-c++-common/gomp/pr85696.c: New test. + 2018-05-10 Jakub Jelinek PR c++/85662