------- Comment #7 from fxcoudert at gcc dot gnu dot org 2006-05-28 19:56
-------
(In reply to comment #6)
> Have you read 4.3.2.1.1? This defines the requirements on the
> collating of the default character type. It also defines the
> requirements on LGT, LGE, LLE, and LLT, which is why we use the
> ascii_table in simplify.c.
OK, I see. I think we don't have users around here using non ASCII-based
charsets, and I also think other parts of the front-end and library would fall
apart on such systems, but anyway, that's not the point.
Anyway, I know it's standard conforming, but having both LLE("é","è") and
LGE("é","è") returning true is... always surprising.
> Thomas' idea of using unsigned char does not conflict with
> 4.3.2.1.1.
Yes, but C strings are char by default and not unsigned char, so I guess we'd
best avoid changing that. But, a less invasive fix could be:
Index: simplify.c
===================================================================
--- simplify.c (revision 113849)
+++ simplify.c (working copy)
@@ -67,7 +67,7 @@
/* Static table for converting non-ascii character sets to ascii.
The xascii_table[] is the inverse table. */
-static int ascii_table[256] = {
+static unsigned char ascii_table[256] = {
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\b', '\t', '\n', '\v', '\0', '\r', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
@@ -86,7 +86,7 @@
'x', 'y', 'z', '{', '|', '}', '~', '\?'
};
-static int xascii_table[256];
+static unsigned int xascii_table[256];
/* Range checks an expression node. If all goes well, returns the
@@ -1196,7 +1196,7 @@
return &gfc_bad_expr;
}
- index = xascii_table[(int) e->value.character.string[0] & 0xFF];
+ index = xascii_table[(unsigned char) e->value.character.string[0] & 0xFF];
result = gfc_int_expr (index);
result->where = e->where;
@@ -4016,9 +4016,9 @@
/* Given a collating table, create the inverse table. */
static void
-invert_table (const int *table, int *xtable)
+invert_table (const unsigned char *table, unsigned int *xtable)
{
- int i;
+ unsigned int i;
for (i = 0; i < 256; i++)
xtable[i] = 0;
Index: arith.c
===================================================================
--- arith.c (revision 113849)
+++ arith.c (working copy)
@@ -1122,9 +1122,10 @@
collating sequence. */
int
-gfc_compare_string (gfc_expr * a, gfc_expr * b, const int *xcoll_table)
+gfc_compare_string (gfc_expr * a, gfc_expr * b, const unsigned int
*xcoll_table)
{
- int len, alen, blen, i, ac, bc;
+ int len, alen, blen, i;
+ unsigned char ac, bc;
alen = a->value.character.length;
blen = b->value.character.length;
Index: arith.h
===================================================================
--- arith.h (revision 113849)
+++ arith.h (working copy)
@@ -41,7 +41,7 @@
arith gfc_range_check (gfc_expr *);
int gfc_compare_expr (gfc_expr *, gfc_expr *);
-int gfc_compare_string (gfc_expr *, gfc_expr *, const int *);
+int gfc_compare_string (gfc_expr *, gfc_expr *, const unsigned int *);
/* Constant folding for gfc_expr trees. */
gfc_expr *gfc_uplus (gfc_expr * op);
Comments on this one?
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27715