/* ABI: actual arguments to CHARACTER(len=1),VALUE
dummy arguments are actually passed by value.
- Strings are truncated to length 1.
- The BIND(C) case is handled elsewhere. */
- if (!fsym->ts.is_c_interop
- && gfc_length_one_character_type_p (&fsym->ts))
+ Strings are truncated to length 1. */
+ if (gfc_length_one_character_type_p (&fsym->ts))
{
- if (e->expr_type != EXPR_CONSTANT)
- {
- tree slen1 = build_int_cst (gfc_charlen_type_node, 1);
- gfc_conv_string_parameter (&parmse);
- parmse.expr = gfc_string_to_single_character (slen1,
- parmse.expr,
- e->ts.kind);
- /* Truncate resulting string to length 1. */
- parmse.string_length = slen1;
- }
- else if (e->value.character.length > 1)
+ if (e->expr_type == EXPR_CONSTANT
+ && e->value.character.length > 1)
{
e->value.character.length = 1;
gfc_conv_expr (&parmse, e);
}
+
+ tree slen1 = build_int_cst (gfc_charlen_type_node, 1);
+ gfc_conv_string_parameter (&parmse);
+ parmse.expr
+ = gfc_string_to_single_character (slen1,
+ parmse.expr,
+ e->ts.kind);
+ /* Truncate resulting string to length 1. */
+ parmse.string_length = slen1;
}
if (fsym->attr.optional
{
tree type;
+ if (TREE_CODE (TREE_TYPE (se->expr)) == INTEGER_TYPE
+ && integer_onep (se->string_length))
+ {
+ se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
+ return;
+ }
+
if (TREE_CODE (se->expr) == STRING_CST)
{
type = TREE_TYPE (TREE_TYPE (se->expr));
&& sym->ns->proc_name
&& sym->ns->proc_name->attr.is_bind_c)
|| (sym->ts.deferred && (!sym->ts.u.cl
- || !sym->ts.u.cl->backend_decl))))
+ || !sym->ts.u.cl->backend_decl))
+ || (sym->attr.dummy
+ && sym->attr.value
+ && gfc_length_one_character_type_p (&sym->ts))))
type = gfc_get_char_type (sym->ts.kind);
else
type = gfc_typenode_for_spec (&sym->ts, sym->attr.codimension);
! { dg-final { scan-tree-dump "multiso .&.v..1..lb: 1 sz: 1., &.x..1..lb: 1 sz: 1..;" "original" } }
! { dg-final { scan-tree-dump "multiso2 .&.w..1..lb: 1 sz: 1., &.x..1..lb: 1 sz: 1..;" "original" } }
!
-! { dg-final { scan-tree-dump "mult_val ..x., .x., 1, 1.;" "original" } }
+! { dg-final { scan-tree-dump "mult_val .120, 120, 1, 1.;" "original" } }
! { dg-final { scan-tree-dump "multiso_val .121, 120.;" "original" } }
-! { dg-final { scan-tree-dump "multiso2_val ..z., .x..;" "original" } }
+! { dg-final { scan-tree-dump "multiso2_val .122, 120.;" "original" } }
!
! Single argument dump:
!
! { dg-final { scan-tree-dump "subiso .&.v..1..lb: 1 sz: 1..;" "original" } }
! { dg-final { scan-tree-dump "subiso2 .&.w..1..lb: 1 sz: 1..;" "original" } }
!
-! { dg-final { scan-tree-dump "sub_val ..x., 1.;" "original" } }
+! { dg-final { scan-tree-dump "sub_val .120, 1.;" "original" } }
! { dg-final { scan-tree-dump "subiso_val .121.;" "original" } }
-! { dg-final { scan-tree-dump "subiso2_val ..z..;" "original" } }
+! { dg-final { scan-tree-dump "subiso2_val .122.;" "original" } }
!