On 2/9/24 11:55, Patrick Palka wrote:
On Fri, 9 Feb 2024, Jason Merrill wrote:

On 2/9/24 10:51, Patrick Palka wrote:
It turns out that with modules we can call mangle_decl recursively,
which is a problem because the global mangling state isn't recursion
aware.  The recursion happens from write_closure_type_name, which calls
lambda function, which performs name lookup, which can trigger lazy
loading,

Hmm, why would looking for a member of a closure trigger lazy loading?

No idea..  We could sidestep lazy loading here by using
get_class_binding_direct instead of lookup_member in lambda_function,
but I don't know if if that would have unintended consequences.

Seems worth trying; the lazy load should still get triggered by some other name lookup.

FWIW the closure for which op() lookup triggers lazy loading is for a
non-generic lambda from an instantiated function template scope and
captures another closure object that captures a dependent function
parameter (_overwrite in libstdc++'s <format> line 1607).  So I'd guess
the entity dependency graph is pretty complicated..

And it seems lazy loading from maybe_lazily_declare can be quite
recursive, I wonder if that's expected?  I attached the full backtrace
that leads mangle_decl recursion, and there's about 15 recursive calls
to maybe_lazily_declare in this backtrace which seem to go through
check_local_shadow.  Maybe we can reduce this somehow?

I think we shouldn't bother with check_local_shadow in a clone or instantiation, only when actually parsing.

Jason

Reply via email to