aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndre Vehreschild <vehre@gcc.gnu.org>2024-08-15 20:23:23 +0200
committerAndre Vehreschild <vehre@gcc.gnu.org>2024-08-19 11:15:13 +0200
commit8871489c5162067c72a9b9ab05fe2179560e9986 (patch)
tree8391af877e34399e9c641119184866dab17375fb /gcc
parent9cbcf8d1de159e6113fafb5dc2feb4a7e467a302 (diff)
downloadgcc-8871489c5162067c72a9b9ab05fe2179560e9986.zip
gcc-8871489c5162067c72a9b9ab05fe2179560e9986.tar.gz
gcc-8871489c5162067c72a9b9ab05fe2179560e9986.tar.bz2
Allow coarrays in select type. [PR46371, PR56496]
Fix ICE when scalar coarrays are used in a select type. Prevent coindexing in associate/select type/select rank selector expression. gcc/fortran/ChangeLog: PR fortran/46371 PR fortran/56496 * expr.cc (gfc_is_coindexed): Detect is coindexed also when rewritten to caf_get. * trans-stmt.cc (trans_associate_var): Always accept a descriptor for coarrays. gcc/testsuite/ChangeLog: * gfortran.dg/coarray/select_type_1.f90: New test. * gfortran.dg/coarray/select_type_2.f90: New test. * gfortran.dg/coarray/select_type_3.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/expr.cc4
-rw-r--r--gcc/fortran/trans-stmt.cc10
-rw-r--r--gcc/testsuite/gfortran.dg/coarray/select_type_1.f9034
-rw-r--r--gcc/testsuite/gfortran.dg/coarray/select_type_2.f9019
-rw-r--r--gcc/testsuite/gfortran.dg/coarray/select_type_3.f9023
5 files changed, 83 insertions, 7 deletions
diff --git a/gcc/fortran/expr.cc b/gcc/fortran/expr.cc
index d3a1f8c..4f2d80c 100644
--- a/gcc/fortran/expr.cc
+++ b/gcc/fortran/expr.cc
@@ -5803,6 +5803,10 @@ gfc_is_coindexed (gfc_expr *e)
{
gfc_ref *ref;
+ if (e->expr_type == EXPR_FUNCTION && e->value.function.isym
+ && e->value.function.isym->id == GFC_ISYM_CAF_GET)
+ e = e->value.function.actual->expr;
+
for (ref = e->ref; ref; ref = ref->next)
if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
return !gfc_ref_this_image (ref);
diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc
index 3b09a13..023b173 100644
--- a/gcc/fortran/trans-stmt.cc
+++ b/gcc/fortran/trans-stmt.cc
@@ -2200,16 +2200,12 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block)
else
stmp = gfc_class_data_get (ctmp);
- /* Coarray scalar component expressions can emerge from
- the front end as array elements of the _data field. */
- if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (stmp)))
- stmp = gfc_conv_descriptor_data_get (stmp);
-
- if (!POINTER_TYPE_P (TREE_TYPE (stmp)))
+ if (!CLASS_DATA (sym)->attr.codimension
+ && !POINTER_TYPE_P (TREE_TYPE (stmp)))
stmp = gfc_build_addr_expr (NULL, stmp);
dtmp = gfc_class_data_get (ctree);
- stmp = fold_convert (TREE_TYPE (dtmp), stmp);
+ stmp = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (dtmp), stmp);
gfc_add_modify (&se.pre, dtmp, stmp);
stmp = gfc_class_vptr_get (ctmp);
dtmp = gfc_class_vptr_get (ctree);
diff --git a/gcc/testsuite/gfortran.dg/coarray/select_type_1.f90 b/gcc/testsuite/gfortran.dg/coarray/select_type_1.f90
new file mode 100644
index 0000000..7f12fb9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray/select_type_1.f90
@@ -0,0 +1,34 @@
+!{ dg-do run }
+
+! Check PR46371 is fixed.
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+
+program pr46371
+ type :: foo
+ integer :: i = 0
+ end type
+
+ class(foo), allocatable :: o_foo[:]
+ integer :: j
+
+ allocate(foo :: o_foo[*])
+ if (this_image() == 1) then
+
+ select type(a => o_foo)
+ type is(foo)
+ j = a[1]%i
+ a[1]%i = 3
+ end select
+
+ if (j /= 0) stop 1
+
+ select type(o_foo)
+ type is(foo)
+ j = o_foo[1]%i
+ end select
+
+ if (o_foo[1]%i /= 3) stop 2
+ if (j /= 3) stop 3
+ end if
+end program pr46371
+
diff --git a/gcc/testsuite/gfortran.dg/coarray/select_type_2.f90 b/gcc/testsuite/gfortran.dg/coarray/select_type_2.f90
new file mode 100644
index 0000000..1694d09
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray/select_type_2.f90
@@ -0,0 +1,19 @@
+!{ dg-do compile }
+
+! Check PR46371 is fixed.
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+
+program pr46371
+ type :: foo
+ integer :: i = 0
+ end type
+
+ class(foo), allocatable :: o_foo[:]
+ integer :: j
+
+ select type(a => o_foo[2]) !{ dg-error "must not be coindexed" }
+ type is(foo)
+ j = a%i
+ end select
+end program pr46371
+
diff --git a/gcc/testsuite/gfortran.dg/coarray/select_type_3.f90 b/gcc/testsuite/gfortran.dg/coarray/select_type_3.f90
new file mode 100644
index 0000000..50f27893
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray/select_type_3.f90
@@ -0,0 +1,23 @@
+!{ dg-do run }
+
+! Check pr56496 is fixed.
+! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+
+program pr56496
+
+ class(*), allocatable :: a[:]
+
+ allocate(integer :: a[*])
+ select type(a)
+ type is (integer)
+ a= 5
+ if (a /= 5) stop 1
+ end select
+
+ select type(a)
+ type is (integer)
+ if (a /= 5) stop 2
+ end select
+
+end
+