On Tue, Jul 23, 2024 at 04:17:22PM -0400, Jason Merrill wrote:
> On 6/15/24 10:29 PM, Nathaniel Shead wrote:
> > Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?
> > 
> > This probably isn't the most efficient approach, since we need to do
> > name lookup to find deduction guides for a type which will also
> > potentially do a bunch of pointless lazy loading from imported modules,
> > but I wasn't able to work out a better approach without completely
> > reworking how deduction guides are stored and represented.
> 
> Indeed.  We likely want to find them more directly from the template; it's
> not clear to me that DECL_INITIAL is used for TEMPLATE_DECL, or we could put
> them in an internal attribute or a separate hash table.
> 
> > -- >8 --
> > 
> > Deduction guides are represented as 'normal' functions currently, and
> > have no special handling in modules.  However, this causes some issues;
> > by [temp.deduct.guide] a deduction guide is not found by normal name
> > lookup and instead all reachable deduction guides for a class template
> > should be considered, but this does not happen currently.
> > 
> > To solve this, this patch ensures that all deduction guides are
> > considered exported to ensure that they are always visible to importers
> > if they are reachable.  Another alternative here would be to add a new
> > kind of "all reachable" flag to name lookup, but that is complicated by
> > some difficulties in handling GM entities; this may be a better way to
> > go if more kinds of entities end up needing this handling, however.
> > 
> > Another issue here is that because deduction guides are "unrelated"
> > functions, they will usually get discarded from the GMF, so this patch
> > ensures that when finding dependencies, GMF deduction guides will also
> > have bindings created.  We do this in find_dependencies so that we don't
> > unnecessarily create bindings for GMF deduction guides that are never
> > reached; for consistency we do this for *all* deduction guides, not just
> > GM ones.
> 
> If you fixed the dependency calculation, why do they also need to be
> exported?
> 
> Jason
> 

Deduction guides aren't found using normal name lookup, but any
reachable deduction guide must be considered.  This means that even if
the module interface exports no declarations whatsoever, a deduction
guide declared in the module purview must still be considered by
importers.

The other option I've considered is adding a new "ANY_REACHABLE" flag to
name lookup which would also consider non-exported reachable decls.  On
further consideration I might actually go this way; I've been thinking
about how to resolve some issues adjacent to supporting textual
redefinitions that I believe this will be necessary for anyway, and we
can probably use this in tsubst_friend_class as well rather than the
current relatively ad-hoc solution.

That said, I've realised that this patch isn't completely sufficient
anyway; consider:

  // m.cpp
  module;
  template <typename T> struct S;
  export module M;
  S(int) -> S<double>;

  // x.cpp
  template <typename T> struct S { S(int); };
  import M;
  int main() {
    S s(10);  // should be S<double> s;
  }

This patch doesn't correctly handle this case yet, we need to also
consider cases where only the deduction guide is in purview.

Nathaniel

Reply via email to