C++: Fix PR86082
authorAndreas Krebbel <krebbel@linux.ibm.com>
Mon, 25 Jun 2018 07:16:59 +0000 (07:16 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Mon, 25 Jun 2018 07:16:59 +0000 (07:16 +0000)
When turning a user-defined numerical literal into an operator
invocation the literal needs to be translated to the execution
character set.

gcc/cp/ChangeLog:

2018-06-25  Andreas Krebbel  <krebbel@linux.ibm.com>

PR C++/86082
* parser.c (make_char_string_pack): Pass this literal chars
through cpp_interpret_string.
(cp_parser_userdef_numeric_literal): Check the result of
make_char_string_pack.

gcc/testsuite/ChangeLog:

2018-06-25  Andreas Krebbel  <krebbel@linux.ibm.com>

PR C++/86082
* g++.dg/pr86082.C: New test.

From-SVN: r262003

gcc/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr86082.C [new file with mode: 0644]

index c40df21200b918ab35e0377b8fa4e658f115d378..f612c5b58c0bf2a176334f75fb18190945e1ed5c 100644 (file)
@@ -1,3 +1,11 @@
+2018-06-25  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       PR C++/86082
+       * parser.c (make_char_string_pack): Pass this literal chars
+       through cpp_interpret_string.
+       (cp_parser_userdef_numeric_literal): Check the result of
+       make_char_string_pack.
+
 2018-06-24  Maya Rashish  <coypu@sdf.org>
 
        * ginclude/stddef.h: Simplify conditions around avoiding
index 154729c641dc907ebd838a20face6e9747a8d042..5e1b67c7be65e4eb3da9ea16ab815bf70aa5ef02 100644 (file)
@@ -4291,7 +4291,16 @@ make_char_string_pack (tree value)
   /* Fill in CHARVEC with all of the parameters.  */
   charvec = make_tree_vec (len);
   for (i = 0; i < len; ++i)
-    TREE_VEC_ELT (charvec, i) = build_int_cst (char_type_node, str[i]);
+    {
+      unsigned char s[3] = { '\'', str[i], '\'' };
+      cpp_string in = { 3, s };
+      cpp_string out = { 0, 0 };
+      if (!cpp_interpret_string (parse_in, &in, 1, &out, CPP_STRING))
+       return NULL_TREE;
+      gcc_assert (out.len == 2);
+      TREE_VEC_ELT (charvec, i) = build_int_cst (char_type_node,
+                                                out.text[0]);
+    }
 
   /* Build the argument packs.  */
   SET_ARGUMENT_PACK_ARGS (argpack, charvec);
@@ -4407,6 +4416,12 @@ cp_parser_userdef_numeric_literal (cp_parser *parser)
   if (decl && decl != error_mark_node)
     {
       tree tmpl_args = make_char_string_pack (num_string);
+      if (tmpl_args == NULL_TREE)
+       {
+         error ("failed to translate literal to execution character set %qT",
+                num_string);
+         return error_mark_node;
+       }
       decl = lookup_template_function (decl, tmpl_args);
       result = finish_call_expr (decl, &args, false, true,
                                 tf_warning_or_error);
index 5ff08f0720ee0021172e16c29ee582fc4d840497..4ca7d21f3eee5951c8cc1720d8e0ddf840ca3648 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-25  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       PR C++/86082
+       * g++.dg/pr86082.C: New test.
+
 2018-06-24  Tom de Vries  <tdevries@suse.de>
 
        * g++.dg/guality/guality.exp: Don't use which on gdb arg to report_gdb.
diff --git a/gcc/testsuite/g++.dg/pr86082.C b/gcc/testsuite/g++.dg/pr86082.C
new file mode 100644 (file)
index 0000000..c7247cd
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do link } */
+/* { dg-options "-fexec-charset=IBM1047 -std=c++11" } */
+
+/* When turning 123_test into an operator invocation the literal 123
+   needs to be translated to the execution character set.  Failing to
+   do so results in a link error since '1', '2', and '3' in the
+   specialization will be translated as string literals.  */
+
+template <char... p> void q();
+template <> void q<'1','2','3'>() {}
+
+template <char... p> void operator""_test() { q<p...> (); }
+
+int
+main ()
+{
+  123_test;
+}