[gcc r14-7008] Fortran: SIZE optional DIM argument having OPTIONAL+VALUE attributes [PR113245]

Harald Anlauf anlauf@gcc.gnu.org
Mon Jan 8 17:50:36 GMT 2024


https://gcc.gnu.org/g:0056458550ba6df0a339589736729be8b886790a

commit r14-7008-g0056458550ba6df0a339589736729be8b886790a
Author: Harald Anlauf <anlauf@gmx.de>
Date:   Sun Jan 7 22:24:25 2024 +0100

    Fortran: SIZE optional DIM argument having OPTIONAL+VALUE attributes [PR113245]
    
    gcc/fortran/ChangeLog:
    
            PR fortran/113245
            * trans-intrinsic.cc (gfc_conv_intrinsic_size): Use
            gfc_conv_expr_present() for proper check of optional DIM argument.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/113245
            * gfortran.dg/size_optional_dim_2.f90: New test.

Diff:
---
 gcc/fortran/trans-intrinsic.cc                    |  4 +--
 gcc/testsuite/gfortran.dg/size_optional_dim_2.f90 | 31 +++++++++++++++++++++++
 2 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index d973c49380c..74139262657 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -8025,9 +8025,6 @@ gfc_conv_intrinsic_size (gfc_se * se, gfc_expr * expr)
 	  argse.data_not_needed = 1;
 	  gfc_conv_expr (&argse, actual->expr);
 	  gfc_add_block_to_block (&se->pre, &argse.pre);
-	  cond = fold_build2_loc (input_location, NE_EXPR, logical_type_node,
-				  argse.expr, null_pointer_node);
-	  cond = gfc_evaluate_now (cond, &se->pre);
 	  /* 'block2' contains the arg2 absent case, 'block' the arg2 present
 	      case; size_var can be used in both blocks. */
 	  tree size_var = gfc_create_var (TREE_TYPE (size), "size");
@@ -8038,6 +8035,7 @@ gfc_conv_intrinsic_size (gfc_se * se, gfc_expr * expr)
 	  tmp = fold_build2_loc (input_location, MODIFY_EXPR,
 				 TREE_TYPE (size_var), size_var, size);
 	  gfc_add_expr_to_block (&block2, tmp);
+	  cond = gfc_conv_expr_present (actual->expr->symtree->n.sym);
 	  tmp = build3_v (COND_EXPR, cond, gfc_finish_block (&block),
 			  gfc_finish_block (&block2));
 	  gfc_add_expr_to_block (&se->pre, tmp);
diff --git a/gcc/testsuite/gfortran.dg/size_optional_dim_2.f90 b/gcc/testsuite/gfortran.dg/size_optional_dim_2.f90
new file mode 100644
index 00000000000..698702b0974
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/size_optional_dim_2.f90
@@ -0,0 +1,31 @@
+! { dg-do run }
+! { dg-additional-options "-fdump-tree-original" }
+! PR fortran/113245 - SIZE, optional DIM argument, w/ OPTIONAL+VALUE attributes
+
+program p
+  implicit none
+  real    :: a(2,3)
+  integer :: expect
+  expect = size (a,2)
+  call ref (a,2)
+  call val (a,2)
+  expect = size (a)
+  call ref (a)
+  call val (a)
+contains
+  subroutine ref (x, dim)
+    real,              intent(in) :: x(:,:)
+    integer, optional, intent(in) :: dim
+    print *, "present(dim), size(a,dim) =", present (dim), size (x,dim=dim)
+    if (size (x,dim=dim) /= expect) stop 1
+  end
+  subroutine val (x, dim)
+    real,              intent(in) :: x(:,:)
+    integer, optional, value      :: dim
+    print *, "present(dim), size(a,dim) =", present (dim), size (x,dim=dim)
+    if (size (x,dim=dim) /= expect) stop 2
+  end
+end
+
+! Ensure inline code is generated:
+! { dg-final { scan-tree-dump-not "_gfortran_size" "original" } }


More information about the Gcc-cvs mailing list