re PR libfortran/50192 (Wrong character comparision with wide strings)
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-29 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/50192 * gfortran.dg/widechar_compare_1.f90: New test. From-SVN: r178173
This commit is contained in:
parent
4d59a001d3
commit
e7898e54f4
|
@ -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>
|
2011-08-26 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
Core DR 342
|
Core DR 342
|
||||||
|
|
|
@ -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
|
|
@ -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>
|
2011-08-28 Thomas Koenig <tkoenig@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/40866
|
PR fortran/40866
|
||||||
|
|
|
@ -51,6 +51,23 @@ memset_char4 (gfc_char4_t *b, gfc_char4_t c, size_t len)
|
||||||
return b;
|
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
|
/* All other functions are defined using a few generic macros in
|
||||||
string_intrinsics_inc.c, so we avoid code duplication between the
|
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
|
#define SUFFIX(x) x
|
||||||
#undef MEMSET
|
#undef MEMSET
|
||||||
#define MEMSET memset
|
#define MEMSET memset
|
||||||
|
#undef MEMCMP
|
||||||
|
#define MEMCMP memcmp
|
||||||
|
|
||||||
#include "string_intrinsics_inc.c"
|
#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
|
#define SUFFIX(x) x ## _char4
|
||||||
#undef MEMSET
|
#undef MEMSET
|
||||||
#define MEMSET memset_char4
|
#define MEMSET memset_char4
|
||||||
|
#undef MEMCMP
|
||||||
|
#define MEMCMP memcmp_char4
|
||||||
|
|
||||||
#include "string_intrinsics_inc.c"
|
#include "string_intrinsics_inc.c"
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ compare_string (gfc_charlen_type len1, const CHARTYPE *s1,
|
||||||
gfc_charlen_type len;
|
gfc_charlen_type len;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
res = memcmp (s1, s2, ((len1 < len2) ? len1 : len2) * sizeof (CHARTYPE));
|
res = MEMCMP (s1, s2, ((len1 < len2) ? len1 : len2));
|
||||||
if (res != 0)
|
if (res != 0)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
|
|
@ -1266,6 +1266,10 @@ extern int compare_string_char4 (gfc_charlen_type, const gfc_char4_t *,
|
||||||
gfc_charlen_type, const gfc_char4_t *);
|
gfc_charlen_type, const gfc_char4_t *);
|
||||||
iexport_proto(compare_string_char4);
|
iexport_proto(compare_string_char4);
|
||||||
|
|
||||||
|
extern int memcmp_char4 (const void *, const void *, size_t);
|
||||||
|
internal_proto(memcmp_char4);
|
||||||
|
|
||||||
|
|
||||||
/* random.c */
|
/* random.c */
|
||||||
|
|
||||||
extern void random_seed_i4 (GFC_INTEGER_4 * size, gfc_array_i4 * put,
|
extern void random_seed_i4 (GFC_INTEGER_4 * size, gfc_array_i4 * put,
|
||||||
|
|
Loading…
Reference in New Issue