]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[og10] openacc: Dereference BT_CLASS data pointers but not BT_DERIVED pointers
authorJulian Brown <julian@codesourcery.com>
Fri, 29 Jan 2021 23:37:27 +0000 (15:37 -0800)
committerJulian Brown <julian@codesourcery.com>
Wed, 24 Feb 2021 14:30:51 +0000 (06:30 -0800)
The stanza in gfc_trans_omp_clauses that handles derived type members
that are themselves derived type pointers or class pointers now adds
an explicit dereference only for the latter. The former is already
dereferenced transparently in gfc_conv_component_ref.

gcc/fortran/
* trans-openmp.c (gfc_trans_omp_clauses): Fix dereferencing for
BT_DERIVED members.

gcc/testsuite/
* gfortran.dg/goacc/derived-classtypes-1.f95: New test.

(cherry picked from commit cff6e8db880b6e262730b1ce9a9cb00c1f5571e2)

gcc/fortran/ChangeLog.omp
gcc/fortran/trans-openmp.c
gcc/testsuite/ChangeLog.omp
gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95 [new file with mode: 0644]

index a02606190319bbf937eed4bb7411e073d0a530fb..9e0cf7198acf0a245cea3585f8e874485527fee9 100644 (file)
@@ -1,3 +1,10 @@
+2021-02-24  Julian Brown  <julian@codesourcery.com>
+
+       Backport from mainline
+
+       * trans-openmp.c (gfc_trans_omp_clauses): Fix dereferencing for
+       BT_DERIVED members.
+
 2021-02-12  Tobias Burnus  <tobias@codesourcery.com>
 
        Backport from mainline
index 452e2a69baa29b3560cf944d17de430e74c6d5ca..e53f7ebb7d7ff39e5f6cfcd3d5873d5b07973bf5 100644 (file)
@@ -2980,6 +2980,8 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
                          if (lastcomp->u.c.component->ts.type == BT_CLASS)
                            {
                              data = gfc_class_data_get (inner);
+                             gcc_assert (POINTER_TYPE_P (TREE_TYPE (data)));
+                             data = build_fold_indirect_ref (data);
                              size = gfc_class_vtab_size_get (inner);
                            }
                          else  /* BT_DERIVED.  */
@@ -2988,8 +2990,7 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
                              size = TYPE_SIZE_UNIT (TREE_TYPE (inner));
                            }
 
-                         OMP_CLAUSE_DECL (node)
-                           = build_fold_indirect_ref (data);
+                         OMP_CLAUSE_DECL (node) = data;
                          OMP_CLAUSE_SIZE (node) = size;
                          node2 = build_omp_clause (input_location,
                                                    OMP_CLAUSE_MAP);
@@ -2997,7 +2998,7 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
                                                   openacc
                                                   ? GOMP_MAP_ATTACH_DETACH
                                                   : GOMP_MAP_ALWAYS_POINTER);
-                         OMP_CLAUSE_DECL (node2) = data;
+                         OMP_CLAUSE_DECL (node2) = build_fold_addr_expr (data);
                          OMP_CLAUSE_SIZE (node2) = size_int (0);
                        }
                      else
index 8f5512990b85f1806a3389544fdae649197bdbe4..8caef33f95e41bf4155465d05c57b6e9b1c812d3 100644 (file)
@@ -1,3 +1,9 @@
+2021-02-24  Julian Brown  <julian@codesourcery.com>
+
+       Backport from mainline
+
+       * gfortran.dg/goacc/derived-classtypes-1.f95: New test.
+
 2021-02-12  Tobias Burnus  <tobias@codesourcery.com>
 
        Backport from mainline
diff --git a/gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95 b/gcc/testsuite/gfortran.dg/goacc/derived-classtypes-1.f95
new file mode 100644 (file)
index 0000000..e6cf09c
--- /dev/null
@@ -0,0 +1,129 @@
+type :: type1
+  integer :: a
+end type type1
+
+type :: type2
+  integer, pointer :: b
+end type type2
+
+type :: aux1
+  integer :: y
+end type aux1
+
+type, extends(aux1) :: aux
+  integer :: x
+end type aux
+
+type :: type3
+  class(aux), pointer :: c(:)
+end type type3
+
+type :: type4
+  integer, pointer :: d(:)
+end type type4
+
+type :: type5
+  type(aux) :: e
+end type type5
+
+type :: type6
+  type(aux), pointer :: f
+end type type6
+
+type :: type7
+  class(aux), pointer :: g
+end type type7
+
+type(type1) :: foo
+type(type2) :: bar
+type(type3) :: qux
+type(type4) :: quux
+type(type5) :: fred
+type(type6) :: jim
+type(type7) :: shiela
+
+type(type1), pointer :: pfoo
+type(type2), pointer :: pbar
+type(type3), pointer :: pqux
+type(type4), pointer :: pquux
+type(type5), pointer :: pfred
+type(type6), pointer :: pjim
+type(type7), pointer :: pshiela
+
+class(type1), pointer :: cfoo
+class(type2), pointer :: cbar
+class(type3), pointer :: cqux
+class(type4), pointer :: cquux
+class(type5), pointer :: cfred
+class(type6), pointer :: cjim
+class(type7), pointer :: cshiela
+
+class(type1), allocatable :: acfoo
+class(type2), allocatable :: acbar
+class(type3), allocatable :: acqux
+class(type4), allocatable :: acquux
+class(type5), allocatable :: acfred
+class(type6), allocatable :: acjim
+class(type7), allocatable :: acshiela
+
+!$acc enter data copyin(foo)
+!$acc enter data copyin(foo%a)
+!$acc enter data copyin(bar)
+!$acc enter data copyin(bar%b)
+!$acc enter data copyin(qux)
+!!$acc enter data copyin(qux%c)
+!$acc enter data copyin(quux)
+!$acc enter data copyin(quux%d)
+!$acc enter data copyin(fred)
+!$acc enter data copyin(fred%e)
+!$acc enter data copyin(jim)
+!$acc enter data copyin(jim%f)
+!$acc enter data copyin(shiela)
+!$acc enter data copyin(shiela%g)
+
+!$acc enter data copyin(pfoo)
+!$acc enter data copyin(pfoo%a)
+!$acc enter data copyin(pbar)
+!$acc enter data copyin(pbar%b)
+!$acc enter data copyin(pqux)
+!!$acc enter data copyin(pqux%c)
+!$acc enter data copyin(pquux)
+!$acc enter data copyin(pquux%d)
+!$acc enter data copyin(pfred)
+!$acc enter data copyin(pfred%e)
+!$acc enter data copyin(pjim)
+!$acc enter data copyin(pjim%f)
+!$acc enter data copyin(pshiela)
+!$acc enter data copyin(pshiela%g)
+
+!$acc enter data copyin(cfoo)
+!$acc enter data copyin(cfoo%a)
+!$acc enter data copyin(cbar)
+!$acc enter data copyin(cbar%b)
+!$acc enter data copyin(cqux)
+!!$acc enter data copyin(cqux%c)
+!$acc enter data copyin(cquux)
+!$acc enter data copyin(cquux%d)
+!$acc enter data copyin(cfred)
+!$acc enter data copyin(cfred%e)
+!$acc enter data copyin(cjim)
+!$acc enter data copyin(cjim%f)
+!$acc enter data copyin(cshiela)
+!$acc enter data copyin(cshiela%g)
+
+!$acc enter data copyin(acfoo)
+!$acc enter data copyin(acfoo%a)
+!$acc enter data copyin(acbar)
+!$acc enter data copyin(acbar%b)
+!$acc enter data copyin(acqux)
+!!$acc enter data copyin(acqux%c)
+!$acc enter data copyin(acquux)
+!$acc enter data copyin(acquux%d)
+!$acc enter data copyin(acfred)
+!$acc enter data copyin(acfred%e)
+!$acc enter data copyin(acjim)
+!$acc enter data copyin(acjim%f)
+!$acc enter data copyin(acshiela)
+!$acc enter data copyin(acshiela%g)
+
+end