On Tue, Apr 3, 2018 at 3:44 AM, Alexandre Oliva <aol...@redhat.com> wrote: > On Apr 2, 2018, Jason Merrill <ja...@redhat.com> wrote: > >> On Sat, Mar 31, 2018 at 2:24 AM, Alexandre Oliva <aol...@redhat.com> wrote: >>> On Mar 30, 2018, Jason Merrill <ja...@redhat.com> wrote: >>> >>>> I don't think we need this; if arg is overloaded, we take the >>>> type_unknown_p early exit, so the code lower down is always dealing >>>> with a single function. >>> >>> Aah, that's why it seemed to me that we had already resolved overloads >>> when we got there. >>> >>> As a bonus, I added the tf_conv test before another mark_used call I'd >>> missed in the previous patch. > >> What if we check tf_conv in mark_used itself rather than at all the call >> sites? > > There are other uses of mark_used, but presumably we want them all to > be more conservative under tf_conv, so... Here's what I'm testing. Ok > if it passes? > > > [PR c++/84943] mark function as used when taking its address > > fn[0]() ICEd because we would fold the INDIRECT_REF used for the > array indexing while building the address for the call, after not > finding the decl hiding there at first. But the decl would be exposed > by the folding, and then lower layers would complain we had the decl, > after all, but it wasn't one of the artificial or special functions > that could be called without being marked as used. > > This patch arranges for a FUNCTION_DECL to be marked as used when > taking its address, just like we already did when taking the address > of a static function to call it as a member function (i.e. using the > obj.fn() notation). However, we shouldn't mark functions as used when > just performing overload resolution, lest we might instantiate > templates we shouldn't, as in g++.dg/overload/template1.C, so we > adjust mark_used to return early when testing conversions. > > > for gcc/cp/ChangeLog > > PR c++/84943 > * typeck.c (cp_build_addr_expr_1): Mark FUNCTION_DECL as > used. > * decl2.c (mark_used): Return without effects if tf_conv. > > for gcc/testsuite/ChangeLog > > PR c++/84943 > * g++.dg/pr84943.C: New. > * g++.dg/pr84943-2.C: New. > --- > gcc/cp/decl2.c | 6 ++++ > gcc/cp/typeck.c | 3 ++ > gcc/testsuite/g++.dg/pr84943-2.C | 64 > ++++++++++++++++++++++++++++++++++++++ > gcc/testsuite/g++.dg/pr84943.C | 8 +++++ > 4 files changed, 81 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/pr84943-2.C > create mode 100644 gcc/testsuite/g++.dg/pr84943.C > > diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c > index fa753749e1a6..740e85b35617 100644 > --- a/gcc/cp/decl2.c > +++ b/gcc/cp/decl2.c > @@ -5201,6 +5201,12 @@ maybe_instantiate_decl (tree decl) > bool > mark_used (tree decl, tsubst_flags_t complain) > { > + /* If we're just testing conversions or resolving overloads, we > + don't want any permanent effects like forcing functions to be > + output or instantiating templates. */ > + if ((complain & tf_conv)) > + return false;
I think we want to return true. Jason