[Bug c/102985] New: [openmp] Bogus "error: lastprivate variable ‘n’ is private in outer context"
burnus at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Oct 28 11:58:21 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102985
Bug ID: 102985
Summary: [openmp] Bogus "error: lastprivate variable ‘n’ is
private in outer context"
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Keywords: openmp, rejects-valid
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: burnus at gcc dot gnu.org
CC: jakub at gcc dot gnu.org
Target Milestone: ---
Shows up at https://github.com/clang-ykt/omptests/ for
t-distribute-simd-clauses/test.c and t-unified-distribute-simd-clauses/test.c
Namely for code like the following:
error: lastprivate variable ‘n’ is private in outer context
-fdump-tree-gimple shows:
#pragma omp distribute private(k.0)
#pragma omp simd linear(k:1) lastprivate(n)
'distribute' permits 'lastprivate' and OpenMP says "The effect of the
lastprivate clause is as if it is applied to all leaf constructs that permit
the clause. [...]".
void test(int *a, int N)
{
#pragma omp target map(tofrom: a[0:100])
{
#pragma omp teams num_teams(1)
{
int n;
#pragma omp distribute simd lastprivate(n)
for(int k=0; k<N; k++) {
a[k] = k;
n = k;
}
a[0] = n;
}
}
}
* * *
For Fortran, it seems to work (original dump):
#pragma omp distribute lastprivate(res)
#pragma omp simd linear(k:1) lastprivate(res)
but I would still suggest to add a testcase for it.
subroutine sub(a, N)
implicit none
integer :: a(0:100), N
integer :: res, k
!$omp target map(tofrom: a)
!$omp teams num_teams(1)
!$omp distribute simd lastprivate(res)
do k=0, N
a(k) = k
res = k
end do
a(0) = res
!$omp end teams
!$omp end target
end
More information about the Gcc-bugs
mailing list