Commit ea219a53 by Julian Brown

openacc: Fortran derived-type mapping fix

Fix a bug with mapping Fortran components which themselves have derived
types in the OpenACC 2.5+ manual deep-copy support.

2020-07-09  Julian Brown  <julian@codesourcery.com>

gcc/fortran/
	* trans-openmp.c (gfc_trans_omp_clauses): Use 'inner' not 'decl' for
	derived type members which themselves have derived types.

gcc/testsuite/
	* gfortran.dg/goacc/mapping-tests-3.f90: New test.
	* gfortran.dg/goacc/mapping-tests-4.f90: New test.

(cherry picked from commit ac8996edb14eef0a15cd0ce850fde2be5e227e69)
parent 0d03c0ee
......@@ -2750,9 +2750,9 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses,
}
else
{
OMP_CLAUSE_DECL (node) = decl;
OMP_CLAUSE_DECL (node) = inner;
OMP_CLAUSE_SIZE (node)
= TYPE_SIZE_UNIT (TREE_TYPE (decl));
= TYPE_SIZE_UNIT (TREE_TYPE (inner));
}
}
else if (lastcomp->next
......
! { dg-additional-options "-fdump-tree-gimple" }
subroutine foo
type one
integer i, j
end type
type two
type(one) A, B
end type
type(two) x
!$acc enter data copyin(x%A)
! { dg-final { scan-tree-dump-times "omp target oacc_enter_exit_data map\\(struct:x \\\[len: 1\\\]\\) map\\(to:x.a \\\[len: \[0-9\]+\\\]\\)" 1 "gimple" } }
end
subroutine foo
type one
integer i, j
end type
type two
type(one) A, B
end type
type(two) x
! This is accepted at present, although it represents a probably-unintentional
! overlapping subcopy.
!$acc enter data copyin(x%A, x%A%i)
! But this raises an error.
!$acc enter data copyin(x%A, x%A%i, x%A%i)
! { dg-error ".x.a.i. appears more than once in map clauses" "" { target *-*-* } .-1 }
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment