From 8b16d23143dd296aa30177b762552c9cd7f472ed Mon Sep 17 00:00:00 2001 From: "Christopher D. Rickett" Date: Mon, 23 Jul 2007 09:03:30 +0000 Subject: re PR fortran/32732 ([Bind C] Character scalars are passed as arrays) 2007-07-23 Christopher D. Rickett PR fortran/32732 * trans-decl.c (generate_local_decl): Convert the TREE_TYPE for by value character dummy args of BIND(C) procedures. * trans-expr.c (gfc_conv_variable): Do not build address expression for BT_CHARACTER dummy args. 2007-07-23 Christopher D. Rickett PR fortran/32732 * gfortran.dg/c_char_tests.f03: New test case. * gfortran.dg/c_char_driver.c: Driver for c_char_tests.f03. * gfortran.dg/c_char_tests_2.f03: New test case. * gfortran.dg/value_6.f03: Ditto. * gfortran.dg/value_7.f03: Ditto. From-SVN: r126836 --- gcc/fortran/ChangeLog | 8 ++++++++ gcc/fortran/trans-decl.c | 13 +++++++++++++ gcc/fortran/trans-expr.c | 5 ----- 3 files changed, 21 insertions(+), 5 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8db51b8..93f5277 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,12 @@ 2007-07-23 Christopher D. Rickett + + PR fortran/32732 + * trans-decl.c (generate_local_decl): Convert the TREE_TYPE for by + value character dummy args of BIND(C) procedures. + * trans-expr.c (gfc_conv_variable): Do not build address + expression for BT_CHARACTER dummy args. + +2007-07-23 Christopher D. Rickett Tobias Burnus PR fortran/32600 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index e07fba4..0acd5f8 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -3018,6 +3018,19 @@ generate_local_decl (gfc_symbol * sym) &sym->declared_at); } + if (sym->attr.dummy == 1) + { + /* Modify the tree type for scalar character dummy arguments of bind(c) + procedures if they are passed by value. The tree type for them will + be promoted to INTEGER_TYPE for the middle end, which appears to be + what C would do with characters passed by-value. The value attribute + implies the dummy is a scalar. */ + if (sym->attr.value == 1 && sym->backend_decl != NULL + && sym->ts.type == BT_CHARACTER && sym->ts.is_c_interop + && sym->ns->proc_name != NULL && sym->ns->proc_name->attr.is_bind_c) + TREE_TYPE (sym->backend_decl) = unsigned_char_type_node; + } + /* Make sure we convert the types of the derived types from iso_c_binding into (void *). */ if (sym->attr.flavor != FL_PROCEDURE && sym->attr.is_iso_c diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 1446d2b..898a626 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -472,11 +472,6 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr) || sym->attr.result)) se->expr = build_fold_indirect_ref (se->expr); - /* A character with VALUE attribute needs an address - expression. */ - if (sym->attr.value) - se->expr = build_fold_addr_expr (se->expr); - } else if (!sym->attr.value) { -- cgit v1.1