aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorChristopher D. Rickett <crickett@lanl.gov>2007-07-23 09:03:30 +0000
committerTobias Burnus <burnus@gcc.gnu.org>2007-07-23 11:03:30 +0200
commit8b16d23143dd296aa30177b762552c9cd7f472ed (patch)
treefc0679cdd58e4a8114cfe5a723e1638911994694 /gcc/fortran
parent089db47df6876c088444d51c3d2f0b33797e6579 (diff)
downloadgcc-8b16d23143dd296aa30177b762552c9cd7f472ed.zip
gcc-8b16d23143dd296aa30177b762552c9cd7f472ed.tar.gz
gcc-8b16d23143dd296aa30177b762552c9cd7f472ed.tar.bz2
re PR fortran/32732 ([Bind C] Character scalars are passed as arrays)
2007-07-23 Christopher D. Rickett <crickett@lanl.gov> 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 <crickett@lanl.gov> 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
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/trans-decl.c13
-rw-r--r--gcc/fortran/trans-expr.c5
3 files changed, 21 insertions, 5 deletions
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 <crickett@lanl.gov>
+
+ 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 <crickett@lanl.gov>
Tobias Burnus <burnus@net-b.de>
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)
{