diff options
author | Christopher D. Rickett <crickett@lanl.gov> | 2007-07-23 09:03:30 +0000 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2007-07-23 11:03:30 +0200 |
commit | 8b16d23143dd296aa30177b762552c9cd7f472ed (patch) | |
tree | fc0679cdd58e4a8114cfe5a723e1638911994694 /gcc/fortran | |
parent | 089db47df6876c088444d51c3d2f0b33797e6579 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 13 | ||||
-rw-r--r-- | gcc/fortran/trans-expr.c | 5 |
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) { |