[PATCH] D123837: [C++20] [Modules] Judge isInCurrentModule currently

Iain Sandoe via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 18 06:43:00 PDT 2022

iains added inline comments.

Comment at: clang/include/clang/Basic/Module.h:537-543
+  static StringRef getPrimaryModuleInterfaceName(StringRef Name) {
+    return Name.split(':').first;
+  }
   /// Get the primary module interface name from a partition.
   StringRef getPrimaryModuleInterfaceName() const {
+    return getPrimaryModuleInterfaceName(getTopLevelModuleName());
I do not understand the purpose of this change, we already iterated over making the function more efficient.

For C++20 modules there cannot be more than one parent - so that the nested call to getTopLevelModule(), via getTopLevelModuleName() is redundant.

Is there some other case that needs special handling?
(If so then I think we should guard this at a higher level)

Comment at: clang/lib/Sema/SemaLookup.cpp:1567-1568
+  return M->getPrimaryModuleInterfaceName() ==
+         Module::getPrimaryModuleInterfaceName(LangOpts.CurrentModule);
... of course, "correctness before optimisation", but this test function seems like it would benefit from some refactoring as suggested below.

it seems a bit unfortunate that we are placing a string comparison in the "acceptable decl" lookup path, which might be made many times (the previous use of the string compare was in making the module decl - which only happens once in a TU).

* Sema has visibility of the import graph of modules (via DirectModuleImports and Exports).
* We also know what the module parse state is (FirstDecl, GMF etc)
* If were are not parsing a module (i.e. LangOpts.CurrentModule.empty()) the we could return false early?
* if ModuleScopes is empty we know we are not (yet) parsing a module
* Once we are parsing a module then we can test ModuleScopes.back() to find the current module 

there are only two users of isInCurrentModule() - so maybe we refactor could make more use of the higher level state information - and / or cache information on the parents of partitions  to  avoid the complexity of parsing strings each time.

what do you think?

Comment at: clang/test/Modules/cxx20-10-1-ex2.cpp:62-69
+// According to [module.import]p7:
+//   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.
+// So B is imported in B:X3 due to B:X2 imported B. So n is visible here.

so, I wonder if this is intended, it seems to defeat the mechanisms to avoid circular dependencies.

module M : Impl; // this is said not to generate a circular dependency because M : Impl does not implicitly import M

import M;  // but now we've done it manually ... and if that module is implicitly exported to importers of the Impl. module interface....


export module M;
import : Impl; 

// ...  then boom! we have a circular dep.



More information about the cfe-commits mailing list