This patch introduces a new kind of ModuleOwnershipKind as ReachableWhenImported. This intended the status for reachable described at: https://eel.is/c++draft/module.reach#3.
Note that this patch is not intended to support all semantics about reachable semantics.
An important feature not included in this patch is discarding declaration in global module fragment. See https://eel.is/c++draft/module.global.frag#3 and https://eel.is/c++draft/module.global.frag#4. This feature is important since it would cut off many unused declarations so that user could import a large module without worrying it would be too heavy. And I think this is related to the bug https://bugs.llvm.org/show_bug.cgi?id=52342 mentioned @rsmith .
But after all, I think it is not easy to implement in one shot. So this patch didn't contain that feature. In other words, now all the declarations in the global module fragment are reachable even they could be reduced. But this is not worse than the current situation. So I think it may not be unacceptable.
Test Plan: check-all and https://godbolt.org/z/81f3ocjfW.