[PATCH] D118586: [C++20][Modules][3/8] Initial handling for module partitions.
Chuanqi Xu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 17 01:07:39 PST 2022
ChuanqiXu added a comment.
I think we should add 2 more tests at least:
Import a partition a module purview but we failed to find one. And test reflects the successful case.
================
Comment at: clang/include/clang/Sema/Sema.h:2989
/// \param ImportLoc The location of the 'import' keyword.
- /// \param Path The module access path.
+ /// \param NamePath The module toplevel name as an access path.
+ /// \param Partition The module partition name as an access path.
----------------
urnathan wrote:
> Is `NamePath` really a better name? You've not consistently changed all `Path`'s to this, and it doesn;t strike me as particularly mnemonic.
I use `Path` in my implementation.
================
Comment at: clang/lib/Sema/SemaDecl.cpp:1611
+ // If we have a decl in a module partition it is part of the containing
+ // module (which is the only thing that can be importing it).
----------------
We lack a comma here.
================
Comment at: clang/lib/Sema/SemaModule.cpp:224-225
+ if (IsPartition) {
+ // Create an interface, but note that it is an implementation
+ // unit.
Mod = Map.createModuleForInterfaceUnit(ModuleLoc, ModuleName,
----------------
I prefer to add more words here to tell why we create an interface unit but the above condition is `ModuleDeclKind::Implementation`.
================
Comment at: clang/lib/Sema/SemaModule.cpp:260
+ ModuleScopes.back().ModuleInterface =
+ (MDK != ModuleDeclKind::Implementation || IsPartition);
+ ModuleScopes.back().IsPartition = IsPartition;
----------------
How about: `Mod->Kind != Module::ModulePartitionImplementation`.
================
Comment at: clang/lib/Sema/SemaModule.cpp:346-347
SourceLocation ImportLoc,
- ModuleIdPath Path) {
- // Flatten the module path for a C++20 or Modules TS module name.
+ ModuleIdPath NamePath,
+ ModuleIdPath Partition) {
+
----------------
I think we could change the signature of the lat 2 fields to
```
ModuleIdPath Path,
bool IsPartition)
```
I feel this is more simpler.
================
Comment at: clang/lib/Sema/SemaModule.cpp:350
+ bool IsPartition = !Partition.empty();
+ bool Cxx20Mode = getLangOpts().CPlusPlusModules || getLangOpts().ModulesTS;
+ assert((!IsPartition || Cxx20Mode) && "partition seen in non-C++20 code?");
----------------
I prefer to remove the support for getLangOpts().ModulesTS on the fly.
================
Comment at: clang/lib/Sema/SemaModule.cpp:359
+
std::string ModuleName;
+ if (IsPartition) {
----------------
I prefer to move the variable to the following block.
================
Comment at: clang/lib/Sema/SemaModule.cpp:361
+ if (IsPartition) {
+ // We already checked that we are in a module purview in the parser.
+ assert(!ModuleScopes.empty() && "in a module purview, but no module?");
----------------
I prefer to add an assertion:
```
assert (ModuleScopes.back().Module.isModulePurview());
```
================
Comment at: clang/lib/Sema/SemaModule.cpp:367-368
+ // owning named module.
+ size_t P = NamedMod->Name.find_first_of(":");
+ ModuleName = NamedMod->Name.substr(0, P + 1);
+ } else {
----------------
I would like to wrap this one as a method of class `Module`:
```
StringRef getPrimaryModuleName(Module *M) {
if (not partition)
return M->Name;
return M->Name.split(":").first;
}
```
================
Comment at: clang/lib/Sema/SemaModule.cpp:373
+ ModuleName = NamedMod->Name;
+ ModuleName += ":";
}
----------------
We could move this below the if statement.
================
Comment at: clang/lib/Sema/SemaModule.cpp:433-451
+ if (NamePath.empty()) {
+ // If this was a header import, pad out with dummy locations.
+ // FIXME: Pass in and use the location of the header-name token in this
+ // case.
+ for (Module *ModCheck = Mod; ModCheck; ModCheck = ModCheck->Parent)
IdentifierLocs.push_back(SourceLocation());
+ } else if (getLangOpts().CPlusPlusModules && !Mod->Parent) {
----------------
I don't find the reason to refactor here. It looks NFC and I think the original form is simpler.
================
Comment at: clang/lib/Sema/SemaModule.cpp:477-480
+ } else if (getLangOpts().isCompilingModule()) {
+ Module *ThisModule = PP.getHeaderSearchInfo().lookupModule(
+ getLangOpts().CurrentModule, ExportLoc, false, false);
+ assert(ThisModule && "was expecting a module if building one");
----------------
What does it assert? I don't get the point.
================
Comment at: clang/test/Modules/cxx20-import-diagnostics-a.cpp:57
+module;
+
----------------
What if we don't add this? I think the original is good. So we should add a new test if we feel needed.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D118586/new/
https://reviews.llvm.org/D118586
More information about the cfe-commits
mailing list