/* Set string length for len=:, only. */
if (sym->ts.type == BT_CHARACTER && !sym->ts.u.cl->length)
{
- tmp = sym->ts.u.cl->backend_decl;
+ tmp2 = gfc_get_cfi_desc_elem_len (cfi);
+ tmp = fold_convert (TREE_TYPE (tmp2), sym->ts.u.cl->backend_decl);
if (sym->ts.kind != 1)
tmp = fold_build2_loc (input_location, MULT_EXPR,
- gfc_array_index_type,
- sym->ts.u.cl->backend_decl, tmp);
- tmp2 = gfc_get_cfi_desc_elem_len (cfi);
- gfc_add_modify (&block, tmp2, fold_convert (TREE_TYPE (tmp2), tmp));
+ TREE_TYPE (tmp2), tmp,
+ build_int_cst (TREE_TYPE (tmp2), sym->ts.kind));
+ gfc_add_modify (&block, tmp2, tmp);
}
if (!sym->attr.dimension)
|| TREE_CODE (TREE_TYPE (se->expr)) == INTEGER_TYPE)
&& TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
{
+ type = TREE_TYPE (se->expr);
if (TREE_CODE (se->expr) != INDIRECT_REF)
- {
- type = TREE_TYPE (se->expr);
- se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
- }
+ se->expr = gfc_build_addr_expr (build_pointer_type (type), se->expr);
else
{
- type = gfc_get_character_type_len (gfc_default_character_kind,
- se->string_length);
+ if (TREE_CODE (type) == ARRAY_TYPE)
+ type = TREE_TYPE (type);
+ type = gfc_get_character_type_len_for_eltype (type,
+ se->string_length);
type = build_pointer_type (type);
se->expr = gfc_build_addr_expr (type, se->expr);
}
&& sym->ns->proc_name->attr.is_bind_c)
|| (sym->ts.deferred && (!sym->ts.u.cl
|| !sym->ts.u.cl->backend_decl))))
- type = gfc_character1_type_node;
+ type = gfc_get_char_type (sym->ts.kind);
else
type = gfc_typenode_for_spec (&sym->ts, sym->attr.codimension);
--- /dev/null
+! { dg-do run }
+! { dg-additional-options "-fdump-tree-original" }
+
+! In this program shall be no kind=1,
+! except for the 'argv' of the 'main' program.
+
+! PR fortran/107266
+
+! { dg-final { scan-tree-dump-times "kind=1" 1 "original" } }
+! { dg-final { scan-tree-dump-times "character\\(kind=1\\) \\* \\* argv\\)" 1 "original" } }
+
+
+! { dg-final { scan-tree-dump-times "character\\(kind=4\\) f \\(character\\(kind=4\\) x\\)" 1 "original" } }
+
+character(kind=4) function f(x) bind(C)
+ character(kind=4), value :: x
+end
+
+program testit
+ implicit none (type, external)
+ character (kind=4, len=:), allocatable :: aa
+ character (kind=4, len=:), pointer :: pp
+
+ pp => NULL ()
+
+ call frobf (aa, pp)
+ if (.not. allocated (aa)) stop 101
+ if (storage_size(aa) /= storage_size(4_'foo')) stop 1
+ if (aa .ne. 4_'foo') stop 102
+ if (.not. associated (pp)) stop 103
+ if (storage_size(pp) /= storage_size(4_'bar')) stop 2
+ if (pp .ne. 4_'bar') stop 104
+
+ pp => NULL ()
+
+ call frobc (aa, pp)
+ if (.not. allocated (aa)) stop 105
+ if (storage_size(aa) /= storage_size(4_'frog')) stop 3
+ if (aa .ne. 4_'frog') stop 106
+ if (.not. associated (pp)) stop 107
+ if (storage_size(pp) /= storage_size(4_'toad')) stop 4
+ if (pp .ne. 4_'toad') stop 108
+
+
+ contains
+
+ subroutine frobf (a, p) Bind(C)
+ character (kind=4, len=:), allocatable :: a
+ character (kind=4, len=:), pointer :: p
+ allocate (character(kind=4, len=3) :: p)
+ a = 4_'foo'
+ p = 4_'bar'
+ end subroutine
+
+ subroutine frobc (a, p) Bind(C)
+ character (kind=4, len=:), allocatable :: a
+ character (kind=4, len=:), pointer :: p
+ allocate (character(kind=4, len=4) :: p)
+ a = 4_'frog'
+ p = 4_'toad'
+ end subroutine
+
+end program
--- /dev/null
+! { dg-do run }
+! { dg-additional-options "-fdump-tree-original" }
+
+! In this program shall be no kind=1,
+! except for the 'argv' of the 'main' program.
+
+! Related PR fortran/107266
+
+! { dg-final { scan-tree-dump-times "kind=1" 1 "original" } }
+! { dg-final { scan-tree-dump-times "character\\(kind=1\\) \\* \\* argv\\)" 1 "original" } }
+
+program testit
+ implicit none (type, external)
+ character (kind=4, len=:), allocatable :: aa
+ character (kind=4, len=:), pointer :: pp
+
+ pp => NULL ()
+
+ call frobf (aa, pp)
+ if (.not. allocated (aa)) stop 101
+ if (storage_size(aa) /= storage_size(4_'foo')) stop 1
+ if (aa .ne. 4_'foo') stop 102
+ if (.not. associated (pp)) stop 103
+ if (storage_size(pp) /= storage_size(4_'bar')) stop 2
+ if (pp .ne. 4_'bar') stop 104
+
+ pp => NULL ()
+
+ call frobc (aa, pp)
+ if (.not. allocated (aa)) stop 105
+ if (storage_size(aa) /= storage_size(4_'frog')) stop 3
+ if (aa .ne. 4_'frog') stop 106
+ if (.not. associated (pp)) stop 107
+ if (storage_size(pp) /= storage_size(4_'toad')) stop 4
+ if (pp .ne. 4_'toad') stop 108
+
+
+ contains
+
+ subroutine frobf (a, p)
+ character (kind=4, len=:), allocatable :: a
+ character (kind=4, len=:), pointer :: p
+ allocate (character(kind=4, len=3) :: p)
+ a = 4_'foo'
+ p = 4_'bar'
+ end subroutine
+
+ subroutine frobc (a, p)
+ character (kind=4, len=:), allocatable :: a
+ character (kind=4, len=:), pointer :: p
+ allocate (character(kind=4, len=4) :: p)
+ a = 4_'frog'
+ p = 4_'toad'
+ end subroutine
+
+end program