summaryrefslogtreecommitdiff
path: root/gcc/fortran/target-memory.c
diff options
context:
space:
mode:
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2008-08-23 18:12:30 +0000
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2008-08-23 18:12:30 +0000
commit1fb2d138a5693b3e13553c0f2e71dcc732479854 (patch)
tree273b66f99e74c0b500509ce36f63ef0c4928f48d /gcc/fortran/target-memory.c
parentcf83ac56b01f1729742e41b9a31dd0c4cbe165d3 (diff)
downloadgcc-1fb2d138a5693b3e13553c0f2e71dcc732479854.tar.gz
2008-08-23 Tobias Burnus <burnus@net-b.de>
PR fortran/37025 * target-memory.c (gfc_interpret_character): Support kind=4 characters. 2008-08-23 Tobias Burnus <burnus@net-b.de> PR fortran/37025 * gfortran.dg/widechar_8.f90: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@139520 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/target-memory.c')
-rw-r--r--gcc/fortran/target-memory.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/gcc/fortran/target-memory.c b/gcc/fortran/target-memory.c
index 40e595ba404..b1029dfa5dc 100644
--- a/gcc/fortran/target-memory.c
+++ b/gcc/fortran/target-memory.c
@@ -399,9 +399,28 @@ gfc_interpret_character (unsigned char *buffer, size_t buffer_size,
result->value.character.string =
gfc_get_wide_string (result->value.character.length + 1);
- gcc_assert (result->ts.kind == gfc_default_character_kind);
- for (i = 0; i < result->value.character.length; i++)
- result->value.character.string[i] = (gfc_char_t) buffer[i];
+ if (result->ts.kind == gfc_default_character_kind)
+ for (i = 0; i < result->value.character.length; i++)
+ result->value.character.string[i] = (gfc_char_t) buffer[i];
+ else
+ {
+ mpz_t integer;
+ unsigned bytes = size_character (1, result->ts.kind);
+ mpz_init (integer);
+ gcc_assert (bytes <= sizeof (unsigned long));
+
+ for (i = 0; i < result->value.character.length; i++)
+ {
+ gfc_conv_tree_to_mpz (integer,
+ native_interpret_expr (gfc_get_char_type (result->ts.kind),
+ &buffer[bytes*i], buffer_size-bytes*i));
+ result->value.character.string[i]
+ = (gfc_char_t) mpz_get_ui (integer);
+ }
+
+ mpz_clear (integer);
+ }
+
result->value.character.string[result->value.character.length] = '\0';
return result->value.character.length;