OK.
On Mon, Sep 19, 2016 at 5:54 PM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > As the testcase shows for C++14 and up, for 1 argument template we don't ICE > even if the template argument is invalid, because it checks > if (TREE_TYPE (parm) != char_type_node > || !TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (parm))) > and if parm is error_mark_node, then it doesn't have char_type_node type. > But, for 2 argument template, if both the template arguments have > error_mark_node type the type test succeeds and we ICE, because DEC_INITIAL > on error_mark_node is not valid. > > The following testcase fixes the ICE and results in the same diagnostics > that used to be emitted for C++11 already before the patch. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2016-09-19 Jakub Jelinek <ja...@redhat.com> > > PR c++/77638 > * parser.c (cp_parser_template_declaration_after_parameter): For 2 > argument operator"" template set ok to false for > parm == error_mark_node. > > * g++.dg/cpp0x/udlit-tmpl-arg-neg2.C: New test. > > --- gcc/cp/parser.c.jj 2016-09-19 10:33:51.000000000 +0200 > +++ gcc/cp/parser.c 2016-09-19 11:29:25.724937375 +0200 > @@ -25722,7 +25722,8 @@ cp_parser_template_declaration_after_par > tree type = INNERMOST_TEMPLATE_PARMS (parm_type); > tree parm_list = TREE_VEC_ELT (parameter_list, 1); > tree parm = INNERMOST_TEMPLATE_PARMS (parm_list); > - if (TREE_TYPE (parm) != TREE_TYPE (type) > + if (parm == error_mark_node > + || TREE_TYPE (parm) != TREE_TYPE (type) > || !TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (parm))) > ok = false; > } > --- gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg2.C.jj 2016-09-19 > 11:34:58.680674929 +0200 > +++ gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg2.C 2016-09-19 > 11:33:54.000000000 +0200 > @@ -0,0 +1,7 @@ > +// PR c++/77638 > +// { dg-do compile { target c++11 } } > + > +template <T, T... U> // { dg-error "'T' has not been declared" } > +int operator"" _foo (); // { dg-error "has invalid parameter > list" } > +template <T... U> // { dg-error "'T' has not been declared" } > +int operator"" _bar (); // { dg-error "has invalid parameter > list" } > > Jakub