]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/58708 (string literal operator templates broken)
authorRichard Sandiford <rdsandiford@googlemail.com>
Thu, 30 Jan 2014 19:44:06 +0000 (19:44 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 30 Jan 2014 19:44:06 +0000 (19:44 +0000)
gcc/cp/
PR c++/58708
* parser.c (make_string_pack): Use double_int::from_buffer.

From-SVN: r207320

gcc/cp/ChangeLog
gcc/cp/parser.c

index 392fd1d766343fb709021980f9c51cbc6b7041dc..625a880d5519eec45adb9e6d5859e2b46a127e2d 100644 (file)
@@ -1,3 +1,8 @@
+2014-01-30  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       PR c++/58708
+       * parser.c (make_string_pack): Use double_int::from_buffer.
+
 2014-01-30  Marek Polacek  <polacek@redhat.com>
 
        PR c/59940
index 0636445198bfba2e9852cb8f19b63ec660b7ba60..a53597d205e5bfbb4b17fbc5ec929bb85ae3e2eb 100644 (file)
@@ -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);