The patch for PR 58708 fixed wide strings being passed as argument packs
but it relied on the host and target having the same endianness.
The patch below uses double_int::from_buffer to handle the case
of differing endiannesses.
Tested on mips64-linux-gnu and mipsisa64-sde-elf (with both endiannesses
in the latter case). It fixes the pr58708.C failures for big endian.
OK to install?
Thanks,
Richard
gcc/cp/
PR c++/58708
* parser.c (make_string_pack): Use double_int::from_buffer.
Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c 2014-01-29 21:49:13.875748266 +0000
+++ gcc/cp/parser.c 2014-01-29 21:49:20.869759475 +0000
@@ -3808,7 +3808,8 @@ make_string_pack (tree value)
{
tree charvec;
tree argpack = make_node (NONTYPE_ARGUMENT_PACK);
- const char *str = TREE_STRING_POINTER (value);
+ const unsigned char *str
+ = (const unsigned char *) TREE_STRING_POINTER (value);
int sz = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (value))));
int len = TREE_STRING_LENGTH (value) / sz - 1;
tree argvec = make_tree_vec (2);
@@ -3821,23 +3822,10 @@ make_string_pack (tree value)
/* Fill in CHARVEC with all of the parameters. */
charvec = make_tree_vec (len);
- if (sz == 1)
- {
- for (int i = 0; i < len; ++i)
- TREE_VEC_ELT (charvec, i) = build_int_cst (str_char_type_node, str[i]);
- }
- else if (sz == 2)
- {
- const uint16_t *num = (const uint16_t *)str;
- for (int i = 0; i < len; ++i)
- TREE_VEC_ELT (charvec, i) = build_int_cst (str_char_type_node, num[i]);
- }
- else if (sz == 4)
- {
- const uint32_t *num = (const uint32_t *)str;
- for (int i = 0; i < len; ++i)
- TREE_VEC_ELT (charvec, i) = build_int_cst (str_char_type_node, num[i]);
- }
+ for (int i = 0; i < len; ++i)
+ TREE_VEC_ELT (charvec, i)
+ = double_int_to_tree (str_char_type_node,
+ double_int::from_buffer (str + i * sz, sz));
/* Build the argument packs. */
SET_ARGUMENT_PACK_ARGS (argpack, charvec);