aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-08-17 13:09:23 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-08-17 13:09:23 +0000
commit000007c53553607813c99368b67c2691bf11eab9 (patch)
tree13fdeb4ff7ed9cef89a72af1fccc8442c308d49d
parent5d39d00bb989107b4bf19311d19eaffc9bc6bf03 (diff)
downloadgcc-000007c53553607813c99368b67c2691bf11eab9.zip
gcc-000007c53553607813c99368b67c2691bf11eab9.tar.gz
gcc-000007c53553607813c99368b67c2691bf11eab9.tar.bz2
re PR libfortran/33079 (Optional empty strings do not appear to be 'PRESENT')
PR fortran/33079 * intrinsics/string_intrinsics.c (string_trim, string_minmax): Fix the zero-length result case. * gfortran.dg/zero_length_2.f90: New test. From-SVN: r127584
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/zero_length_2.f9016
-rw-r--r--libgfortran/ChangeLog6
-rw-r--r--libgfortran/intrinsics/string_intrinsics.c20
4 files changed, 39 insertions, 8 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a320c2e..7ababfa 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-08-17 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR fortran/33079
+ * gfortran.dg/zero_length_2.f90: New test.
+
2007-08-17 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/kind_tests_2.f03: Add cleanup-modules.
diff --git a/gcc/testsuite/gfortran.dg/zero_length_2.f90 b/gcc/testsuite/gfortran.dg/zero_length_2.f90
new file mode 100644
index 0000000..31b99f5
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/zero_length_2.f90
@@ -0,0 +1,16 @@
+! { dg-do run }
+ character(len=1) :: s
+ character(len=0) :: s0 ! { dg-warning "CHARACTER variable has zero length" }
+ s = " "
+ s0 = ""
+ call bar ("")
+ call bar (s)
+ call bar (s0)
+ call bar (trim(s))
+ call bar (min(s0,s0))
+contains
+ subroutine bar (s)
+ character(len=*), optional :: s
+ if (.not. present (S)) call abort
+ end subroutine bar
+end
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 2305b3e..de3d574 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2007-08-17 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR fortran/33079
+ * intrinsics/string_intrinsics.c (string_trim, string_minmax): Fix
+ the zero-length result case.
+
2007-08-15 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/33077
diff --git a/libgfortran/intrinsics/string_intrinsics.c b/libgfortran/intrinsics/string_intrinsics.c
index be02811..c663daa 100644
--- a/libgfortran/intrinsics/string_intrinsics.c
+++ b/libgfortran/intrinsics/string_intrinsics.c
@@ -77,6 +77,11 @@ export_proto(string_trim);
extern void string_minmax (GFC_INTEGER_4 *, void **, int, int, ...);
export_proto(string_minmax);
+
+/* Use for functions which can return a zero-length string. */
+static char zero_length_string = '\0';
+
+
/* Strings of unequal length are extended with pad characters. */
int
@@ -167,16 +172,16 @@ string_trim (GFC_INTEGER_4 * len, void ** dest, GFC_INTEGER_4 slen,
}
*len = i + 1;
- if (*len > 0)
+ if (*len == 0)
+ *dest = &zero_length_string;
+ else
{
/* Allocate space for result string. */
*dest = internal_malloc_size (*len);
- /* copy string if necessary. */
+ /* Copy string if necessary. */
memmove (*dest, src, *len);
}
- else
- *dest = NULL;
}
@@ -403,14 +408,13 @@ string_minmax (GFC_INTEGER_4 *rlen, void **dest, int op, int nargs, ...)
}
va_end (ap);
- if (*rlen > 0)
+ if (*rlen == 0)
+ *dest = &zero_length_string;
+ else
{
char * tmp = internal_malloc_size (*rlen);
memcpy (tmp, res, reslen);
memset (&tmp[reslen], ' ', *rlen - reslen);
*dest = tmp;
}
- else
- *dest = NULL;
}
-