ChuanqiXu9 wrote: > > Maybe you can test it with this and land it with different patches. So that > > we can revert one of them if either of them are problematic but other parts > > are fine. > > I'm ok with pushing the commits one-by-one after the PR is reviewed, just let > me know. > > > > Complete only needed partial specializations: It is unclear (to me) why > > > this needs to be done "for safety", but this change significantly > > > improves the effectiveness of lazy loading. > > > > > > This comes from the logic: if we have a partial template specialization > > `A<int, T, U>` and we need a full specialization for `A<int, double, > > double>`, we hope the partial specialization to be loaded > > Sure, but in my understanding, that's not needed on the `ASTReader` side but > is taken care of by `Sema` (?). For the following example: > > ```c++ > //--- partial.cppm > export module partial; > > export template <typename S, typename T, typename U> > struct Partial { > static constexpr int Value() { return 0; } > }; > > export template <typename T, typename U> > struct Partial<int, T, U> { > static constexpr int Value() { return 1; } > }; > > //--- partial.cpp > import partial; > > static_assert(Partial<int, double, double>::Value() == 1); > ``` > > (I assume that's what you have in mind?) I see two calls to > `ASTReader::CompleteRedeclChain` (with this PR applied): The first asks for > the full instantiation `Partial<int, double, double>` and regardless of what > we load, the answer to the query is that it's not defined yet. The second > asks for the partial specialization `Partial<int, T, U>` and then > instantiation proceeds to do the right thing.
If it works, I feel good with it. https://github.com/llvm/llvm-project/pull/133057 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits