diff options
author | Sandra Loosemore <sandra@codesourcery.com> | 2021-07-22 15:15:50 -0700 |
---|---|---|
committer | Sandra Loosemore <sandra@codesourcery.com> | 2021-07-22 15:15:50 -0700 |
commit | e4966e1d1de54441bdaed54eb00084db4193bbbf (patch) | |
tree | 0929fed109a5b2666daf0becc111f5f2d15600ae | |
parent | 8ed6cfbbee74ec9e03f2558b9c36f61dd7d4dcfd (diff) | |
download | gcc-e4966e1d1de54441bdaed54eb00084db4193bbbf.zip gcc-e4966e1d1de54441bdaed54eb00084db4193bbbf.tar.gz gcc-e4966e1d1de54441bdaed54eb00084db4193bbbf.tar.bz2 |
Bind(c): signed char is not a Fortran character type
CFI_allocate and CFI_select_part were incorrectly treating
CFI_type_signed_char as a Fortran character type for the purpose of
deciding whether or not to use the elem_len argument. It is a Fortran
integer type per table 18.2 in the 2018 Fortran standard.
Other functions in ISO_Fortran_binding.c appeared to handle this case
correctly already.
2021-07-15 Sandra Loosemore <sandra@codesourcery.com>
libgfortran/
* runtime/ISO_Fortran_binding.c (CFI_allocate): Don't use elem_len
for CFI_type_signed_char.
(CFI_select_part): Likewise.
-rw-r--r-- | libgfortran/runtime/ISO_Fortran_binding.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/libgfortran/runtime/ISO_Fortran_binding.c b/libgfortran/runtime/ISO_Fortran_binding.c index 73fb4c4..773d24e 100644 --- a/libgfortran/runtime/ISO_Fortran_binding.c +++ b/libgfortran/runtime/ISO_Fortran_binding.c @@ -229,10 +229,9 @@ CFI_allocate (CFI_cdesc_t *dv, const CFI_index_t lower_bounds[], } } - /* If the type is a character, the descriptor's element length is replaced - by the elem_len argument. */ - if (dv->type == CFI_type_char || dv->type == CFI_type_ucs4_char || - dv->type == CFI_type_signed_char) + /* If the type is a Fortran character type, the descriptor's element + length is replaced by the elem_len argument. */ + if (dv->type == CFI_type_char || dv->type == CFI_type_ucs4_char) dv->elem_len = elem_len; /* Dimension information and calculating the array length. */ @@ -731,9 +730,9 @@ int CFI_select_part (CFI_cdesc_t *result, const CFI_cdesc_t *source, } } - /* Element length. */ - if (result->type == CFI_type_char || result->type == CFI_type_ucs4_char || - result->type == CFI_type_signed_char) + /* Element length is ignored unless result->type specifies a Fortran + character type. */ + if (result->type == CFI_type_char || result->type == CFI_type_ucs4_char) result->elem_len = elem_len; if (unlikely (compile_options.bounds_check)) |