diff mbox series

Fortran: Fix rank of assumed-rank array [PR99043]

Message ID 4f5fc485-3cc9-122e-be36-eadf576675db@codesourcery.com
State New
Headers show
Series Fortran: Fix rank of assumed-rank array [PR99043] | expand

Commit Message

Tobias Burnus Feb. 11, 2021, 6:02 p.m. UTC
In the Fortran standard, I think it is best explained
in the description of the RANK intrinsic:

"Example. If X is an assumed-rank dummy argument and
its associated effective argument is an array of rank,
RANK(X) has the value 3."

That's already well tested in assumed_rank_16.f90;
however, as the PR shows, this should not be reset
to "-1" when passing it further on as actual argument to
another assumed-rank dummy argument.

OK for mainline?
Reported against GCC 10, not a regression but simple wrong-code fix;
does it make sense to apply there was well?

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf

Comments

Paul Richard Thomas Feb. 12, 2021, 1:25 p.m. UTC | #1
Hi Tobias,

The patch is good for 10- and 11-branches.

Thanks

Paul


On Thu, 11 Feb 2021 at 18:59, Tobias Burnus <tobias@codesourcery.com> wrote:

> In the Fortran standard, I think it is best explained
> in the description of the RANK intrinsic:
>
> "Example. If X is an assumed-rank dummy argument and
> its associated effective argument is an array of rank,
> RANK(X) has the value 3."
>
> That's already well tested in assumed_rank_16.f90;
> however, as the PR shows, this should not be reset
> to "-1" when passing it further on as actual argument to
> another assumed-rank dummy argument.
>
> OK for mainline?
> Reported against GCC 10, not a regression but simple wrong-code fix;
> does it make sense to apply there was well?
>
> Tobias
>
> -----------------
> Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München
> Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank
> Thürauf
>
Thomas Koenig Feb. 17, 2021, 9:56 p.m. UTC | #2
Hi Tobias,

> OK for mainline?
> Reported against GCC 10, not a regression but simple wrong-code fix;
> does it make sense to apply there was well?

OK for both.

Thanks for the patch!

Best regards

	Thomas
diff mbox series

Patch

Fortran: Fix rank of assumed-rank array [PR99043]

gcc/fortran/ChangeLog:

	PR fortran/99043
	* trans-expr.c (gfc_conv_procedure_call): Don't reset
	rank of assumed-rank array.

gcc/testsuite/ChangeLog:

	PR fortran/99043
	* gfortran.dg/assumed_rank_20.f90: New test.

 gcc/fortran/trans-expr.c                      |  5 ++--
 gcc/testsuite/gfortran.dg/assumed_rank_20.f90 | 36 +++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index b0c8d577ca5..103cb31c664 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -6403,9 +6403,10 @@  gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
 
 	      /* Unallocated allocatable arrays and unassociated pointer arrays
 		 need their dtype setting if they are argument associated with
-		 assumed rank dummies.  */
+		 assumed rank dummies, unless already assumed rank.  */
 	      if (!sym->attr.is_bind_c && e && fsym && fsym->as
-		  && fsym->as->type == AS_ASSUMED_RANK)
+		  && fsym->as->type == AS_ASSUMED_RANK
+		  && e->rank != -1)
 		{
 		  if (gfc_expr_attr (e).pointer
 		      || gfc_expr_attr (e).allocatable)
diff --git a/gcc/testsuite/gfortran.dg/assumed_rank_20.f90 b/gcc/testsuite/gfortran.dg/assumed_rank_20.f90
new file mode 100644
index 00000000000..10ad1fc8e89
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/assumed_rank_20.f90
@@ -0,0 +1,36 @@ 
+! { dg-do run }
+!
+! PR fortran/99043
+!
+module assumed_rank_module
+    implicit none
+    private
+
+    public :: rank_of_pointer_level1
+contains
+    subroutine rank_of_pointer_level1(ap,aa)
+        real, dimension(..), intent(in), pointer :: ap
+        real, dimension(..), intent(in), allocatable :: aa
+        if (rank(ap) /= 3) stop 1
+        if (rank(aa) /= 3) stop 2
+        call rank_of_pointer_level2(ap, aa)
+    end subroutine rank_of_pointer_level1
+
+    subroutine rank_of_pointer_level2(ap,aa)
+        real, dimension(..), intent(in), pointer :: ap
+        real, dimension(..), intent(in), allocatable :: aa
+
+        if (rank(ap) /= 3) stop 3
+        if (rank(aa) /= 3) stop 4
+    end subroutine rank_of_pointer_level2
+end module assumed_rank_module
+
+program assumed_rank
+    use :: assumed_rank_module, only : rank_of_pointer_level1
+    implicit none
+    real, dimension(:,:,:), pointer :: ap
+    real, dimension(:,:,:), allocatable :: aa
+
+    ap => null()
+    call rank_of_pointer_level1(ap, aa)
+end program assumed_rank