Namespace-scope declarations exported by the imported translation units
can be found by name lookup ([basic.lookup])
in the importing translation unit
and declarations within the imported translation units
become reachable ([module.reach])
in the importing translation unit
after the import declaration.
A module-import-declaration nominating
a header-name is also recognized by the
preprocessor, and results in macros defined at the
end of phase 4 of translation of the header unit
being made visible as described in [cpp.import].
A declaration of a name with internal linkage is
permitted within a header unit despite all
declarations being implicitly exported ([module.interface]).
Additionally, when a module-import-declaration
in a module unit of some module M imports another module unit U of M,
it also imports all translation units imported by
non-exported module-import-declarations
in the module unit purview of U.89
These rules can in turn lead to the importation of yet more
translation units.
A translation unit has an interface dependency on a translation unit U
if it contains a declaration (possibly a module-declaration)
that imports U or if it has
an interface dependency on a translation unit that has an interface dependency on U.
A translation unit shall not have an interface dependency on itself.