aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/c-lex.c2
-rw-r--r--gcc/expr.c13
3 files changed, 17 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 46e9945..c6e8733 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2000-09-12 Jakub Jelinek <jakub@redhat.com>
+
+ * c-lex.c (lex_string): Use charwidth to compute bytemask.
+ * expr.c (expand_expr): Don't optimize constant array references
+ initialized with wide string constants.
+
2000-09-13 Michael Hayes <mhayes@cygnus.com>
* loop.c (note_set_pseudo_multiple_uses): Correct.
diff --git a/gcc/c-lex.c b/gcc/c-lex.c
index fa5c7a7..f9c5cb4 100644
--- a/gcc/c-lex.c
+++ b/gcc/c-lex.c
@@ -2381,7 +2381,7 @@ lex_string (str, len, wide)
if (wide)
{
unsigned charwidth = TYPE_PRECISION (char_type_node);
- unsigned bytemask = (1 << width) - 1;
+ unsigned bytemask = (1 << charwidth) - 1;
int byte;
for (byte = 0; byte < WCHAR_BYTES; ++byte)
diff --git a/gcc/expr.c b/gcc/expr.c
index 9c4237b..baa4ef1 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6619,9 +6619,16 @@ expand_expr (exp, target, tmode, modifier)
else if (TREE_CODE (init) == STRING_CST
&& 0 > compare_tree_int (index,
TREE_STRING_LENGTH (init)))
- return (GEN_INT
- (TREE_STRING_POINTER
- (init)[TREE_INT_CST_LOW (index)]));
+ {
+ tree type = TREE_TYPE (TREE_TYPE (init));
+ enum machine_mode mode = TYPE_MODE (type);
+
+ if (GET_MODE_CLASS (mode) == MODE_INT
+ && GET_MODE_SIZE (mode) == 1)
+ return (GEN_INT
+ (TREE_STRING_POINTER
+ (init)[TREE_INT_CST_LOW (index)]));
+ }
}
}
}