On Tue, Apr 3, 2018 at 11:47 AM, Jason Merrill <ja...@redhat.com> wrote: > 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.
(OK with that change.) Jason