Commit 7067f8c8 by Paul Thomas

Patch for PR92959

parent 63cc547f
...@@ -8573,7 +8573,6 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr) ...@@ -8573,7 +8573,6 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr)
gfc_se arg2se; gfc_se arg2se;
tree tmp2; tree tmp2;
tree tmp; tree tmp;
tree nonzero_charlen;
tree nonzero_arraylen; tree nonzero_arraylen;
gfc_ss *ss; gfc_ss *ss;
bool scalar; bool scalar;
...@@ -8629,13 +8628,6 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr) ...@@ -8629,13 +8628,6 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr)
if (arg2->expr->ts.type == BT_CLASS) if (arg2->expr->ts.type == BT_CLASS)
gfc_add_data_component (arg2->expr); gfc_add_data_component (arg2->expr);
nonzero_charlen = NULL_TREE;
if (arg1->expr->ts.type == BT_CHARACTER)
nonzero_charlen = fold_build2_loc (input_location, NE_EXPR,
logical_type_node,
arg1->expr->ts.u.cl->backend_decl,
build_zero_cst
(TREE_TYPE (arg1->expr->ts.u.cl->backend_decl)));
if (scalar) if (scalar)
{ {
/* A pointer to a scalar. */ /* A pointer to a scalar. */
...@@ -8705,10 +8697,15 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr) ...@@ -8705,10 +8697,15 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr)
/* If target is present zero character length pointers cannot /* If target is present zero character length pointers cannot
be associated. */ be associated. */
if (nonzero_charlen != NULL_TREE) if (arg1->expr->ts.type == BT_CHARACTER)
se->expr = fold_build2_loc (input_location, TRUTH_AND_EXPR, {
logical_type_node, tmp = arg1se.string_length;
se->expr, nonzero_charlen); tmp = fold_build2_loc (input_location, NE_EXPR,
logical_type_node, tmp,
build_zero_cst (TREE_TYPE (tmp)));
se->expr = fold_build2_loc (input_location, TRUTH_AND_EXPR,
logical_type_node, se->expr, tmp);
}
} }
se->expr = convert (gfc_typenode_for_spec (&expr->ts), se->expr); se->expr = convert (gfc_typenode_for_spec (&expr->ts), se->expr);
......
! { dg-do run }
!
! Test the fix for PR92959, where compilation of ASSOCIATED segfaulted in 's1' and 's2'.
!
! Contributed by Gerhard Steinmetz <gscfq@t-online.de>
!
program p
character(:), pointer :: x, y => NULL()
character, pointer :: u, v => NULL ()
character(4), target :: tgt = "abcd"
! Manifestly not associated
x => tgt
u => tgt(1:1)
call s1 (.false., 1)
call s2 (.false., 2)
! Manifestly associated
y => x
v => u
call s1 (.true., 3)
call s2 (.true., 4)
! Zero sized storage sequences must give a false.
y => tgt(1:0)
x => y
call s1 (.false., 5)
contains
subroutine s1 (state, err_no)
logical :: state
integer :: err_no
if (associated(x, y) .neqv. state) stop err_no
end
subroutine s2 (state, err_no)
logical :: state
integer :: err_no
if (associated(u, v) .neqv. state) stop err_no
end
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment