On 8/26/20 12:56 PM, Nathan Sidwell wrote:
On 8/26/20 12:06 PM, Jason Merrill wrote:
On 8/26/20 8:30 AM, Nathan Sidwell wrote:
Jason's fix to retain operator lookups inside dependent lambda
functions turns out to be needed on the modules branch for all
template functions. Because the context for that lookup no longer
exists in imports. There were also a couple of shortcomings, which
this patch fixes.
(a) we conflate 'we found nothing' and 'we can redo this at
instantiation time'. Fixed by making the former produce
error_mark_node. That needs a fix in name-lookup to know that finding
a binding containing error_mark_node, means 'stop looking' you found
nothing.
(b) we'd continually do lookups for every operator, if nothing needed
to be retained. Fixed by always caching that information, and then
dealing with it when pushing the bindings.
(c) if what we found was that find by a global namespace lookup, we'd
not cache that. But that'd cause us to find decls declared
after the template, potentially hiding those we expected to find. So
don't do that check.
This still retains only recording on lambdas. As the comment says, we
could enable for all templates.
If we're going to need it on all templates for modules, is there a
reason not to go ahead and make that change now?
No reason.
Do we need a different approach for operator lookup in non-function
template contexts, e.g. data member initializers?
Hm, I guess we do.
Perhaps represent the operation as a CALL_EXPR with
CALL_EXPR_OPERATOR_SYNTAX set?
Jason