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);