Author: Iain Sandoe
Date: 2022-02-28T08:50:25Z
New Revision: b3fcfcb9464b90dd56a591e6269d33b124b96fee

URL: 
https://github.com/llvm/llvm-project/commit/b3fcfcb9464b90dd56a591e6269d33b124b96fee
DIFF: 
https://github.com/llvm/llvm-project/commit/b3fcfcb9464b90dd56a591e6269d33b124b96fee.diff

LOG: [C++20][Modules][7/8] Find the primary interface name for a module.

When we are building modules, there are cases where the only way to determine
validity of access is by comparing primary interface names.  This is because we 
need
to be able to associate a primary interface name with an imported partition, but
before the primary interface module is complete - so that textual comparison is
necessary.

If this turns out to be needed many times, we could cache the result, but it 
seems
unlikely to be significant (at this time); cases with very many imported 
partitions
would seem unusual.

Differential Revision: https://reviews.llvm.org/D118598

Added: 
    

Modified: 
    clang/include/clang/Basic/Module.h
    clang/lib/Sema/SemaModule.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/Module.h 
b/clang/include/clang/Basic/Module.h
index b05d3c654e726..ac3bb1b3ef109 100644
--- a/clang/include/clang/Basic/Module.h
+++ b/clang/include/clang/Basic/Module.h
@@ -517,6 +517,16 @@ class Module {
   /// Is this a module partition.
   bool isModulePartition() const { return Name.find(':') != std::string::npos; 
}
 
+  /// Get the primary module interface name from a partition.
+  StringRef getPrimaryModuleInterfaceName() const {
+    if (Kind == ModulePartitionInterface ||
+        Kind == ModulePartitionImplementation) {
+      auto pos = Name.find(':');
+      return StringRef(Name.data(), pos);
+    }
+    return Name;
+  }
+
   /// Retrieve the full name of this module, including the path from
   /// its top-level module.
   /// \param AllowStringLiterals If \c true, components that might not be

diff  --git a/clang/lib/Sema/SemaModule.cpp b/clang/lib/Sema/SemaModule.cpp
index a829693fafebc..6bb886bfe53c6 100644
--- a/clang/lib/Sema/SemaModule.cpp
+++ b/clang/lib/Sema/SemaModule.cpp
@@ -382,17 +382,10 @@ DeclResult Sema::ActOnModuleImport(SourceLocation 
StartLoc,
     // We already checked that we are in a module purview in the parser.
     assert(!ModuleScopes.empty() && "in a module purview, but no module?");
     Module *NamedMod = ModuleScopes.back().Module;
-    if (ModuleScopes.back().IsPartition) {
-      // We're importing a partition into a partition, find the name of the
-      // owning named module.
-      size_t P = NamedMod->Name.find_first_of(":");
-      ModuleName = NamedMod->Name.substr(0, P + 1);
-    } else {
-      // We're importing a partition into the named module itself (either the
-      // interface or an implementation TU).
-      ModuleName = NamedMod->Name;
-      ModuleName += ":";
-    }
+    // If we are importing into a partition, find the owning named module,
+    // otherwise, the name of the importing named module.
+    ModuleName = NamedMod->getPrimaryModuleInterfaceName().str();
+    ModuleName += ":";
     ModuleName += stringFromPath(Partition);
     ModuleNameLoc = {PP.getIdentifierInfo(ModuleName), Partition[0].second};
     Partition = ModuleIdPath(ModuleNameLoc);


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to