From: Tobias Burnus <[email protected]>
gcc/fortran/ChangeLog:
* openmp.c (resolve_omp_clauses): Explicitly diagnose
substrings as not permitted.
gcc/testsuite/ChangeLog:
* gfortran.dg/goacc/substring.f90: New test.
* gfortran.dg/gomp/substring.f90: New test.
(cherry picked from commit f0e618faeb619ec02dabbef203a5575fca44a7f7)
---
gcc/fortran/ChangeLog.omp | 7 +++++
gcc/fortran/openmp.c | 8 +++++-
gcc/testsuite/ChangeLog.omp | 7 +++++
gcc/testsuite/gfortran.dg/goacc/substring.f90 | 27 +++++++++++++++++++
gcc/testsuite/gfortran.dg/gomp/substring.f90 | 22 +++++++++++++++
5 files changed, 70 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gfortran.dg/goacc/substring.f90
create mode 100644 gcc/testsuite/gfortran.dg/gomp/substring.f90
diff --git a/gcc/fortran/ChangeLog.omp b/gcc/fortran/ChangeLog.omp
index 2dd82a70cb71..09c2bb855c88 100644
--- a/gcc/fortran/ChangeLog.omp
+++ b/gcc/fortran/ChangeLog.omp
@@ -1,3 +1,10 @@
+2021-02-24 Tobias Burnus <[email protected]>
+
+ Backport from mainline
+
+ * openmp.c (resolve_omp_clauses): Explicitly diagnose
+ substrings as not permitted.
+
2021-02-24 Julian Brown <[email protected]>
Backport from mainline
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 61a340d7f396..a7592f0545d9 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -4978,7 +4978,13 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses
*omp_clauses,
|| (n->expr
&& (!resolved || n->expr->expr_type != EXPR_VARIABLE)))
{
- if (!resolved
+ if (array_ref
+ && (array_ref->type == REF_SUBSTRING
+ || (array_ref->next
+ && array_ref->next->type == REF_SUBSTRING)))
+ gfc_error ("Unexpected substring reference in %s clause "
+ "at %L", name, &n->where);
+ else if (!resolved
|| n->expr->expr_type != EXPR_VARIABLE
|| array_ref->next
|| array_ref->type != REF_ARRAY)
diff --git a/gcc/testsuite/ChangeLog.omp b/gcc/testsuite/ChangeLog.omp
index e04a4ee3ebff..d012e9e75b4e 100644
--- a/gcc/testsuite/ChangeLog.omp
+++ b/gcc/testsuite/ChangeLog.omp
@@ -1,3 +1,10 @@
+2021-02-24 Tobias Burnus <[email protected]>
+
+ Backport from mainline
+
+ * gfortran.dg/goacc/substring.f90: New test.
+ * gfortran.dg/gomp/substring.f90: New test.
+
2021-02-24 Julian Brown <[email protected]>
Backport from mainline
diff --git a/gcc/testsuite/gfortran.dg/goacc/substring.f90
b/gcc/testsuite/gfortran.dg/goacc/substring.f90
new file mode 100644
index 000000000000..25031daddf33
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/substring.f90
@@ -0,0 +1,27 @@
+implicit none
+character(len=10) :: str1, str2(5,5)
+
+type t
+ character(len=10) :: str1, str2(5,5)
+end type t
+type(t) :: v
+
+!$acc enter data copyin(v%str1) ! OK
+!$acc enter data copyin(v%str2) ! OK
+!$acc enter data copyin(v%str2(1,2)) ! OK
+!$acc enter data copyin(str1) ! OK
+!$acc enter data copyin(str2) ! OK
+!$acc enter data copyin(str2(1,2)) ! OK
+
+!$acc enter data copyin(v%str1(2:5)) ! { dg-error "Unexpected substring
reference in MAP clause" }
+!$acc enter data copyin(v%str2(1,2)(2:4)) ! { dg-error "Unexpected substring
reference in MAP clause" }
+!$acc enter data copyin(str1(2:5)) ! { dg-error "Unexpected substring
reference in MAP clause" }
+!$acc enter data copyin(str2(1,2)(2:4)) ! { dg-error "Unexpected substring
reference in MAP clause" }
+
+!$acc parallel
+!$acc update host(v%str1(2:5)) ! { dg-error "Unexpected substring
reference in MAP clause" }
+!$acc update host(v%str2(1,2)(2:4)) ! { dg-error "Unexpected substring
reference in MAP clause" }
+!$acc update host(str1(2:5)) ! { dg-error "Unexpected substring
reference in MAP clause" }
+!$acc update host(str2(1,2)(2:4)) ! { dg-error "Unexpected substring
reference in MAP clause" }
+!$acc end parallel
+end
diff --git a/gcc/testsuite/gfortran.dg/gomp/substring.f90
b/gcc/testsuite/gfortran.dg/gomp/substring.f90
new file mode 100644
index 000000000000..23d7fb7e48ab
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/substring.f90
@@ -0,0 +1,22 @@
+implicit none
+character(len=10) :: str1, str2(5,5)
+
+type t
+ character(len=10) :: str1, str2(5,5)
+end type t
+type(t) :: v
+
+!$omp target enter data map(to: str1) ! OK
+!$omp target enter data map(to: str2) ! OK
+!$omp target enter data map(to: str2(2,5)) ! OK
+
+!$omp target enter data map(to: str1(2,5)) ! { dg-error "Syntax error
in OpenMP variable list" }
+!$omp target enter data map(to: str2(1,2)(2:4)) ! { dg-error "Unexpected
substring reference in MAP clause" }
+
+!$omp target enter data map(to: v%str1) ! OK
+!$omp target enter data map(to: v%str2) ! OK
+!$omp target enter data map(to: v%str2(1,2)) ! OK
+
+!$omp target enter data map(to: v%str1(2:5)) ! { dg-error "Unexpected
substring reference in MAP clause" }
+!$omp target enter data map(to: v%str2(1,2)(2:4)) ! { dg-error "Unexpected
substring reference in MAP clause" }
+end
--
2.29.2