On Wed, May 28, 2025 at 12:24:54AM -0400, Jason Merrill wrote:
> On 11/27/24 11:17 AM, Jason Merrill wrote:
> > On 11/27/24 1:43 AM, Nathaniel Shead wrote:
> > > On Wed, Nov 27, 2024 at 12:03:23AM -0500, Jason Merrill wrote:
> > > > Tested x86_64-pc-linux-gnu.
> > > > 
> > > > Does this approach make sense to you?  Any other ideas?
> > > > 
> > > > -- 8< --
> > > > 
> > > > We weren't representing 'using namespace' at all in modules, which broke
> > > > some of the <chrono> literals tests.
> > > > 
> > > > I experimented with various approaches to representing them, and
> > > > ended up
> > > > with emitting them as a pseudo-binding for "using", which as a
> > > > keyword can't
> > > > have any real bindings.  Then reading this pseudo-binding adds it to
> > > > using_directives instead of the usual handling.
> > > > 
> > > > +    /* ??? should we try to distinguish whether the using-directive
> > > > +       is purview/exported?  */
> > > > +    add_binding_entity (used, WMB_Flags(WMB_Using|WMB_Purview), &data);
> > > 
> > > I don't think the standard is entirely clear about how using-directives
> > > should interact with modules; they don't declare names, and before P2615
> > > were in fact forbidden from being explicitly exported, which implies to
> > > me that the intention was for them to not be considered outside of the
> > > declaring module.
> > 
> > P2615 is certainly clear about allowing them.  Given that, I think the
> > general rules of [module.interface] apply, so it should be found by name
> > lookup in an importing TU.
> > 
> > > That said, if we were to do this I would think the logic should match
> > > what we do for any other name, in terms of requiring it to be explicitly
> > > exported/purview as required; in particular, I would hope that something
> > > like this doesn't happen:
> > > 
> > >    // m.cpp
> > >    export module M;
> > >    using namespace std;
> > > 
> > >    // test.cpp
> > >    #include <iostream>
> > >    import M;
> > >    int main() {
> > >      cout << "hello\n";  // using-directive "inherited" from M?
> > >    }
> > 
> > Good point, I have more work to do.
> > 
> > I think that since ADL doesn't consider using-directives, we only need
> > to represent the exported ones?
> > 
> > > >   name_lookup::search_namespace_only (tree scope)
> > > >   {
> > > >     bool found = false;
> > > > +  if (modules_p () && name && !id_equal (name, "using"))
> > > > +    {
> > > > +      name_lookup u (get_identifier ("using"));
> > > > +      u.search_namespace_only (scope);
> > > > +    }
> > > 
> > > Could we just add to the list of using-directives within read_namespaces
> > > perhaps?  Probably as a second pass after all namespaces have been
> > > created so that we don't run into issues with circular directives.
> > > That would mean we wouldn't need to do this in every lookup.
> > 
> > That was my first thought, but I had trouble figuring out how.  Perhaps
> > I'll try again.
> 
> Done thus.  Any thoughts on this version?

LGTM!

Nathaniel

Reply via email to