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");
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);
--- /dev/null
+! { 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" } }