OSDN Git Service

2011-08-29 Thomas Koenig <tkoenig@gcc.gnu.org>
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Aug 2011 09:05:11 +0000 (09:05 +0000)
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Aug 2011 09:05:11 +0000 (09:05 +0000)
PR libfortran/50192
* intrinsics/string_intrinsics.c (memcmp_char4):  New function.
* intrinsics/string_intrinsics_inc.c:  New macro MEMCMP, either
set to memcmp or memcmp_char4.
(compare_string):  Use MEMCMP, with correct size for it.
* libgfortran.h:  Add prototype for memcmp_char4.

2011-08-29  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR libfortran/50192
* gfortran.dg/widechar_compare_1.f90:  New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178173 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/widechar_compare_1.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/intrinsics/string_intrinsics.c
libgfortran/intrinsics/string_intrinsics_inc.c
libgfortran/libgfortran.h

index 03a45a4..7c6f93f 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-29  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/50192
+       * gfortran.dg/widechar_compare_1.f90:  New test.
+
 2011-08-26  Jason Merrill  <jason@redhat.com>
 
        Core DR 342
diff --git a/gcc/testsuite/gfortran.dg/widechar_compare_1.f90 b/gcc/testsuite/gfortran.dg/widechar_compare_1.f90
new file mode 100644 (file)
index 0000000..4410110
--- /dev/null
@@ -0,0 +1,10 @@
+! { dg-do run }
+! PR 50192 - on little-endian systems, this used to fail.
+program main
+  character(kind=4,len=2) :: c1, c2
+  c1 = 4_' '
+  c2 = 4_' '
+  c1(1:1) = transfer(257, mold=c1(1:1))
+  c2(1:1) = transfer(64, mold=c2(1:1))
+  if (c1 < c2) call abort
+end program main
index 427e4b6..6c57beb 100644 (file)
@@ -1,3 +1,12 @@
+2011-08-29  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/50192
+       * intrinsics/string_intrinsics.c (memcmp_char4):  New function.
+       * intrinsics/string_intrinsics_inc.c:  New macro MEMCMP, either
+       set to memcmp or memcmp_char4.
+       (compare_string):  Use MEMCMP, with correct size for it.
+       * libgfortran.h:  Add prototype for memcmp_char4.
+
 2011-08-28  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/40866
index e2e14e0..a1d3b31 100644 (file)
@@ -51,6 +51,23 @@ memset_char4 (gfc_char4_t *b, gfc_char4_t c, size_t len)
   return b;
 }
 
+/* Compare wide character types, which are handled internally as
+   unsigned 4-byte integers.  */
+int
+memcmp_char4 (const void *a, const void *b, size_t len)
+{
+  const GFC_UINTEGER_4 *pa = a;
+  const GFC_UINTEGER_4 *pb = b;
+  while (len-- > 0)
+    {
+      if (*pa != *pb)
+       return *pa < *pb ? -1 : 1;
+      pa ++;
+      pb ++;
+    }
+  return 0;
+}
+
 
 /* All other functions are defined using a few generic macros in
    string_intrinsics_inc.c, so we avoid code duplication between the
@@ -64,6 +81,8 @@ memset_char4 (gfc_char4_t *b, gfc_char4_t c, size_t len)
 #define SUFFIX(x) x
 #undef  MEMSET
 #define MEMSET memset
+#undef  MEMCMP
+#define MEMCMP memcmp
 
 #include "string_intrinsics_inc.c"
 
@@ -76,6 +95,8 @@ memset_char4 (gfc_char4_t *b, gfc_char4_t c, size_t len)
 #define SUFFIX(x) x ## _char4
 #undef  MEMSET
 #define MEMSET memset_char4
+#undef  MEMCMP
+#define MEMCMP memcmp_char4
 
 #include "string_intrinsics_inc.c"
 
index 64f5cd7..8335a38 100644 (file)
@@ -90,7 +90,7 @@ compare_string (gfc_charlen_type len1, const CHARTYPE *s1,
   gfc_charlen_type len;
   int res;
 
-  res = memcmp (s1, s2, ((len1 < len2) ? len1 : len2) * sizeof (CHARTYPE));
+  res = MEMCMP (s1, s2, ((len1 < len2) ? len1 : len2));
   if (res != 0)
     return res;
 
index b72b250..148dcfb 100644 (file)
@@ -1266,6 +1266,10 @@ extern int compare_string_char4 (gfc_charlen_type, const gfc_char4_t *,
                                 gfc_charlen_type, const gfc_char4_t *);
 iexport_proto(compare_string_char4);
 
+extern int memcmp_char4 (const void *, const void *, size_t);
+internal_proto(memcmp_char4);
+
+
 /* random.c */
 
 extern void random_seed_i4 (GFC_INTEGER_4 * size, gfc_array_i4 * put,