OK.
On Mon, Jan 2, 2017 at 3:11 PM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > As the testcase shows, if some initializers are type dependent, auto_result > is still using auto, is not yet deduced and the deduction will happen during > instantiation. So rejecting it due to inconsistent deduction when one > type is int and another type auto (or vice versa) is wrong, during > instantiation it could be still instantiated with initializers that are > valid. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > Though, the PR also shows that we should do similar diagnostics about > inconsistent auto deduction at instantiation time, but we don't have > infrastructure for that (at tsubst time we don't know which variables > were declared together in a single declaration, nor the auto_result > for those vars where the auto deduction happened already during parsing). > So I think further work is needed on this PR. > > 2017-01-02 Jakub Jelinek <ja...@redhat.com> > > PR c++/78693 > * parser.c (cp_parser_simple_declaration): Only complain about > inconsistent auto deduction if auto_result doesn't use auto. > > * g++.dg/cpp0x/pr78693.C: New test. > > --- gcc/cp/parser.c.jj 2017-01-01 12:45:44.000000000 +0100 > +++ gcc/cp/parser.c 2017-01-02 14:02:49.690859759 +0100 > @@ -12770,9 +12770,11 @@ cp_parser_simple_declaration (cp_parser* > if (cp_parser_error_occurred (parser)) > goto done; > > - if (auto_result) > + if (auto_result > + && (!processing_template_decl || !type_uses_auto (auto_result))) > { > - if (last_type && last_type != error_mark_node > + if (last_type > + && last_type != error_mark_node > && !same_type_p (auto_result, last_type)) > { > /* If the list of declarators contains more than one declarator, > --- gcc/testsuite/g++.dg/cpp0x/pr78693.C.jj 2017-01-02 14:05:45.494582539 > +0100 > +++ gcc/testsuite/g++.dg/cpp0x/pr78693.C 2017-01-02 14:05:07.000000000 > +0100 > @@ -0,0 +1,31 @@ > +// PR c++/78693 > +// { dg-do compile { target c++11 } } > + > +template <class T> > +void > +foo (T t) > +{ > + auto i = t, j = 1; // { dg-bogus "inconsistent deduction" } > +} > + > +template <class T> > +void > +bar (T t) > +{ > + auto i = 1, j = t, k = 2; // { dg-bogus "inconsistent deduction" } > +} > + > +template <class T, class U> > +void > +foo (T t, U u) > +{ > + auto i = t, j = u; // { dg-bogus "inconsistent deduction" } > +} > + > +void > +foo () > +{ > + foo (0); > + bar (0); > + foo (1, 2); > +} > > Jakub