Message ID | 20180620114107.11570-1-krebbel@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
Series | C++: Fix PR86083 | expand |
On Wed, Jun 20, 2018 at 7:41 AM, Andreas Krebbel <krebbel@linux.vnet.ibm.com> wrote: > When turning a user-defined numerical literal into an operator > invocation the literal needs to be translated to the execution > character set. > > Bootstrapped and regtested on s390x. x86_64 still running. > Ok to apply if x86_64 is clean? > > Bye, > > -Andreas- > > gcc/cp/ChangeLog: > > 2018-06-20 Andreas Krebbel <krebbel@linux.ibm.com> > > PR C++/86082 > * parser.c (make_char_string_pack): > (cp_parser_userdef_numeric_literal): You're missing a description of the changes. OK with that corrected. Jason
Hi Andreas, > When turning a user-defined numerical literal into an operator > invocation the literal needs to be translated to the execution > character set. > > Bootstrapped and regtested on s390x. x86_64 still running. > Ok to apply if x86_64 is clean? the new testcase FAILs on Solaris FAIL: g++.dg/pr86082.C (test for excess errors) Excess errors: cc1plus: error: conversion from UTF-8 to IBM1047 not supported by iconv and, according to gcc-testresults, on powerpc-ibm-aix7.2.0.0. Fixed as follows, tested on i386-pc-solaris2.11, installed on mainline. Rainer
On 06/26/2018 11:17 AM, Rainer Orth wrote: > Hi Andreas, > >> When turning a user-defined numerical literal into an operator >> invocation the literal needs to be translated to the execution >> character set. >> >> Bootstrapped and regtested on s390x. x86_64 still running. >> Ok to apply if x86_64 is clean? > > the new testcase FAILs on Solaris > > FAIL: g++.dg/pr86082.C (test for excess errors) > > Excess errors: > cc1plus: error: conversion from UTF-8 to IBM1047 not supported by iconv > > and, according to gcc-testresults, on powerpc-ibm-aix7.2.0.0. > > Fixed as follows, tested on i386-pc-solaris2.11, installed on mainline. Thanks for fixing it! -Andreas-
On 06/20/2018 01:41 PM, Andreas Krebbel wrote: > When turning a user-defined numerical literal into an operator > invocation the literal needs to be translated to the execution > character set. > > Bootstrapped and regtested on s390x. x86_64 still running. > Ok to apply if x86_64 is clean? > > Bye, > > -Andreas- > > gcc/cp/ChangeLog: > > 2018-06-20 Andreas Krebbel <krebbel@linux.ibm.com> > > PR C++/86082 > * parser.c (make_char_string_pack): > (cp_parser_userdef_numeric_literal): > > gcc/testsuite/ChangeLog: > > 2018-06-20 Andreas Krebbel <krebbel@linux.ibm.com> > > PR C++/86082 > * g++.dg/pr86082.C: New test. I've tested the patch also on GCC 7 and 8 branch. Ok to apply there as well? The backport will include the testcase fix from Rainer: https://gcc.gnu.org/ml/gcc-patches/2018-06/msg01601.html -Andreas-
On Fri, Jul 6, 2018 at 5:20 PM, Andreas Krebbel <krebbel@linux.ibm.com> wrote: > On 06/20/2018 01:41 PM, Andreas Krebbel wrote: >> When turning a user-defined numerical literal into an operator >> invocation the literal needs to be translated to the execution >> character set. >> >> Bootstrapped and regtested on s390x. x86_64 still running. >> Ok to apply if x86_64 is clean? >> >> Bye, >> >> -Andreas- >> >> gcc/cp/ChangeLog: >> >> 2018-06-20 Andreas Krebbel <krebbel@linux.ibm.com> >> >> PR C++/86082 >> * parser.c (make_char_string_pack): >> (cp_parser_userdef_numeric_literal): >> >> gcc/testsuite/ChangeLog: >> >> 2018-06-20 Andreas Krebbel <krebbel@linux.ibm.com> >> >> PR C++/86082 >> * g++.dg/pr86082.C: New test. > > I've tested the patch also on GCC 7 and 8 branch. Ok to apply there as well? Hmm, it seems safe enough, but also seems like a change with a limited audience. Would it work for you to include the patch just in your builds of GCC 7 and 8? Jason
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index c6206fc..9522861 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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); diff --git a/gcc/testsuite/g++.dg/pr86082.C b/gcc/testsuite/g++.dg/pr86082.C new file mode 100644 index 0000000..c7247cd --- /dev/null +++ b/gcc/testsuite/g++.dg/pr86082.C @@ -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; +}