diff options
author | Francois-Xavier Coudert <coudert@clipper.ens.fr> | 2006-10-31 21:15:22 +0100 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2006-10-31 20:15:22 +0000 |
commit | 150675a88bae488e66055ad2a1eba0309ecabce3 (patch) | |
tree | 1024583b95a9dd9e2598bb3e446caa4624ef6e9f | |
parent | 70198b9f22c93aeab38aacafe9e2aec87d126813 (diff) | |
download | gcc-150675a88bae488e66055ad2a1eba0309ecabce3.zip gcc-150675a88bae488e66055ad2a1eba0309ecabce3.tar.gz gcc-150675a88bae488e66055ad2a1eba0309ecabce3.tar.bz2 |
re PR fortran/29067 (gfc_resolve_expr(): Bad expression type)
PR fortran/29067
* decl.c (gfc_set_constant_character_len): NULL-terminate the
character constant string.
* data.c (create_character_intializer): Likewise.
* expr.c (gfc_simplify_expr): NULL-terminate the substring
character constant.
* primary.c (match_hollerith_constant): NULL-terminate the
character constant string.
* gfortran.dg/pr29067.f: New test.
From-SVN: r118338
-rw-r--r-- | gcc/fortran/data.c | 3 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 3 | ||||
-rw-r--r-- | gcc/fortran/expr.c | 2 | ||||
-rw-r--r-- | gcc/fortran/primary.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr29067.f | 18 |
6 files changed, 29 insertions, 3 deletions
diff --git a/gcc/fortran/data.c b/gcc/fortran/data.c index 2ab6f50..d53f92c 100644 --- a/gcc/fortran/data.c +++ b/gcc/fortran/data.c @@ -155,7 +155,8 @@ create_character_intializer (gfc_expr * init, gfc_typespec * ts, init->expr_type = EXPR_CONSTANT; init->ts = *ts; - dest = gfc_getmem (len); + dest = gfc_getmem (len + 1); + dest[len] = '\0'; init->value.character.length = len; init->value.character.string = dest; /* Blank the string if we're only setting a substring. */ diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index e17e9e3..84797b7 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -754,10 +754,11 @@ gfc_set_constant_character_len (int len, gfc_expr * expr) slen = expr->value.character.length; if (len != slen) { - s = gfc_getmem (len); + s = gfc_getmem (len + 1); memcpy (s, expr->value.character.string, MIN (len, slen)); if (len > slen) memset (&s[slen], ' ', len - slen); + s[len] = '\0'; gfc_free (expr->value.character.string); expr->value.character.string = s; expr->value.character.length = len; diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 1f51fd0..d2da0d8 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -1438,7 +1438,7 @@ gfc_simplify_expr (gfc_expr * p, int type) gfc_extract_int (p->ref->u.ss.end, &end); s = gfc_getmem (end - start + 1); memcpy (s, p->value.character.string + start, end - start); - s[end] = '\0'; /* TODO: C-style string for debugging. */ + s[end-start+1] = '\0'; /* TODO: C-style string for debugging. */ gfc_free (p->value.character.string); p->value.character.string = s; p->value.character.length = end - start; diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index 1dd8626..9982b61 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -281,6 +281,7 @@ match_hollerith_constant (gfc_expr ** result) gfc_default_character_kind, &gfc_current_locus); e->value.character.string = gfc_getmem (num+1); memcpy (e->value.character.string, buffer, num); + e->value.character.string[num] = '\0'; e->value.character.length = num; *result = e; return MATCH_YES; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 28d64cb..53ed758 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-10-31 Francois-Xavier Coudert <coudert@clipper.ens.fr> + + PR fortran/29067 + * gfortran.dg/pr29067.f: New test. + 2006-10-31 Joseph Myers <joseph@codesourcery.com> Richard Sandiford <richard@codesourcery.com> diff --git a/gcc/testsuite/gfortran.dg/pr29067.f b/gcc/testsuite/gfortran.dg/pr29067.f new file mode 100644 index 0000000..5167114 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr29067.f @@ -0,0 +1,18 @@ + ! { dg-do compile } + ! PR fortran/29067 + implicit none + integer :: n, i + character(len=16),parameter :: s = "", s2 = "1234567890123456" + + i = 0 ; n = 9 + print *, s(9:16) + print *, s2(9:16) + if (s(9:16) == "90123456") then + endif + if (i > 0) then + write (i,*) n + call foo(0) + endif + do i = 1, n + end do + end |