Fortran: Fix character-kind=4 substring resolution (PR95837)

Testing showed that it is always set and its value matches
always ts->kind (if available) or otherwise, if it is a variable,
the sym->ts.kind.

gcc/fortran/ChangeLog:

	PR fortran/95837
	* resolve.c (gfc_resolve_substring_charlen): Remove
	bogus ts.kind setting for the expression.

gcc/testsuite/ChangeLog:

	PR fortran/95837
	* gfortran.dg/char4-subscript.f90: New test.
This commit is contained in:
Tobias Burnus 2020-06-25 16:57:08 +02:00
parent 628b78f979
commit f48bffe70c
2 changed files with 30 additions and 3 deletions

View File

@ -5140,9 +5140,6 @@ gfc_resolve_substring_charlen (gfc_expr *e)
return;
}
e->ts.type = BT_CHARACTER;
e->ts.kind = gfc_default_character_kind;
if (!e->ts.u.cl)
e->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);

View File

@ -0,0 +1,30 @@
! { dg-do run }
! { dg-additional-options "-fdump-tree-original" }
!
! PR fortran/95837
!
type t
character(len=:, kind=4), pointer :: str2
end type t
type(t) :: var
allocate(character(len=5, kind=4) :: var%str2)
var%str2(1:1) = 4_"d"
var%str2(2:3) = 4_"ef"
var%str2(4:4) = achar(int(Z'1F600'), kind=4)
var%str2(5:5) = achar(int(Z'1F608'), kind=4)
if (var%str2(1:3) /= 4_"def") stop 1
if (ichar(var%str2(4:4)) /= int(Z'1F600')) stop 2
if (ichar(var%str2(5:5)) /= int(Z'1F608')) stop 2
deallocate(var%str2)
end
! Note: the last '\x00' is regarded as string terminator, hence, the tailing \0 byte is not in the dump
! { dg-final { scan-tree-dump " \\(\\*var\\.str2\\)\\\[1\\\]{lb: 1 sz: 4} = .d\\\\x00\\\\x00.\\\[1\\\]{lb: 1 sz: 4};" "original" } }
! { dg-final { scan-tree-dump " __builtin_memmove \\(\\(void \\*\\) &\\(\\*var.str2\\)\\\[2\\\]{lb: 1 sz: 4}, \\(void \\*\\) &.e\\\\x00\\\\x00\\\\x00f\\\\x00\\\\x00.\\\[1\\\]{lb: 1 sz: 4}, 8\\);" "original" } }
! { dg-final { scan-tree-dump " \\(\\*var.str2\\)\\\[4\\\]{lb: 1 sz: 4} = .\\\\x00\\\\xf6\\\\x01.\\\[1\\\]{lb: 1 sz: 4};" "original" } }
! { dg-final { scan-tree-dump " \\(\\*var.str2\\)\\\[5\\\]{lb: 1 sz: 4} = .\\\\b\\\\xf6\\\\x01.\\\[1\\\]{lb: 1 sz: 4};" "original" } }