http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50192
Bug #: 50192 Summary: Wrong character comparision with wide strings Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: libfortran AssignedTo: unassig...@gcc.gnu.org ReportedBy: tkoe...@gcc.gnu.org CC: jvdeli...@gcc.gnu.org ig25@linux-fd1f:~/Krempel/4> cat compare.f90 program main character(kind=4,len=2) :: c1, c2 c1 = 4_' ' c2 = 4_' ' c1(1:1) = transfer(257, mold=c1) c2(1:1) = transfer(64, mold=c2) if (c1 < c2) print *,"strange..." end program main ig25@linux-fd1f:~/Krempel/4> gfortran compare.f90 ig25@linux-fd1f:~/Krempel/4> ./a.out strange... The problem is in compare_string. We use int compare_string (gfc_charlen_type len1, const CHARTYPE *s1, gfc_charlen_type len2, const CHARTYPE *s2) { const UCHARTYPE *s; gfc_charlen_type len; int res; res = memcmp (s1, s2, ((len1 < len2) ? len1 : len2) * sizeof (CHARTYPE)); which works on big-endian, but not on little-endian, where the memcmp is used to compare (bytewise) 0x01 0x01 0x00 0x00 vs. 0x40 0x00 0x00 0x00.