Commit 75cdd535 by Paul Thomas

re PR fortran/58618 (Wrong code with character substring and ASSOCIATE)

2018-10-18  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/58618
	* trans-stmt.c (trans_associate_var): All strings that return
	as pointer types can be assigned directly to the associate
	name so remove 'attr' and the condition that uses it.

2018-10-18  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/58618
	* gfortran.dg/associate_45.f90 : New test.

From-SVN: r265264
parent 75a6d7da
2018-10-18 Paul Thomas <pault@gcc.gnu.org> 2018-10-18 Paul Thomas <pault@gcc.gnu.org>
PR fortran/58618 PR fortran/58618
* trans-stmt.c (trans_associate_var): All strings that return
as pointer types can be assigned directly to the associate
name so remove 'attr' and the condition that uses it.
2018-10-18 Paul Thomas <pault@gcc.gnu.org>
PR fortran/58618
* trans-decl.c (gfc_get_symbol_decl): Deal correctly with the * trans-decl.c (gfc_get_symbol_decl): Deal correctly with the
initialization with NULL() of a deferred length pointer. initialization with NULL() of a deferred length pointer.
......
...@@ -1656,7 +1656,6 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block) ...@@ -1656,7 +1656,6 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block)
bool need_len_assign; bool need_len_assign;
bool whole_array = true; bool whole_array = true;
gfc_ref *ref; gfc_ref *ref;
symbol_attribute attr;
gcc_assert (sym->assoc); gcc_assert (sym->assoc);
e = sym->assoc->target; e = sym->assoc->target;
...@@ -1916,9 +1915,7 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block) ...@@ -1916,9 +1915,7 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block)
} }
} }
attr = gfc_expr_attr (e);
if (sym->ts.type == BT_CHARACTER && e->ts.type == BT_CHARACTER if (sym->ts.type == BT_CHARACTER && e->ts.type == BT_CHARACTER
&& (attr.allocatable || attr.pointer || attr.dummy)
&& POINTER_TYPE_P (TREE_TYPE (se.expr))) && POINTER_TYPE_P (TREE_TYPE (se.expr)))
{ {
/* These are pointer types already. */ /* These are pointer types already. */
......
2018-10-18 Paul Thomas <pault@gcc.gnu.org> 2018-10-18 Paul Thomas <pault@gcc.gnu.org>
PR fortran/58618 PR fortran/58618
* gfortran.dg/associate_45.f90 : New test.
2018-10-18 Paul Thomas <pault@gcc.gnu.org>
PR fortran/58618
* gfortran.dg/deferred_character_30.f90 : New test. * gfortran.dg/deferred_character_30.f90 : New test.
2018-10-18 Richard Biener <rguenther@suse.de> 2018-10-18 Richard Biener <rguenther@suse.de>
......
! { dg-do run }
!
! Test the fix for PR58618 by checking that substring associate targets
! work correctly.
!
! Contributed by Vladimir Fuka <vladimir.fuka@gmail.com>
!
character(5) :: s(2) = ['abcde','fghij']
character (6), pointer :: ptr => NULL()
character (6), target :: tgt = 'lmnopq'
associate (x=>s(2)(3:4))
if (x .ne. 'hi') stop 1
x = 'uv'
end associate
if (any (s .ne. ['abcde','fguvj'])) stop 2
! Unity based substrings are cast differently. */
associate (x=>s(1)(1:4))
if (x .ne. 'abcd') stop 3
x(2:3) = 'wx'
end associate
if (any (s .ne. ['awxde','fguvj'])) stop 4
! Make sure that possible misidentifications do not occur.
ptr => tgt
associate (x=>ptr)
if (x .ne. 'lmnopq') stop 5
x(2:3) = 'wx'
end associate
if (tgt .ne. 'lwxopq') stop 6
associate (x=>ptr(5:6))
if (x .ne. 'pq') stop 7
x = 'wx'
end associate
if (tgt .ne. 'lwxowx') stop 8
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