diff --git a/clang/include/clang/Basic/Module.h b/clang/include/clang/Basic/Module.h index 953d18352dac6e..d2e7f84ecca594 100644 --- a/clang/include/clang/Basic/Module.h +++ b/clang/include/clang/Basic/Module.h @@ -15,13 +15,11 @@ #ifndef LLVM_CLANG_BASIC_MODULE_H #define LLVM_CLANG_BASIC_MODULE_H -#include "clang/Basic/FileManager.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/PointerIntPair.h" -#include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/STLExtras.h" @@ -44,6 +42,9 @@ class raw_ostream; namespace clang { +class DirectoryEntry; +class FileEntry; +class FileManager; class LangOptions; class TargetInfo; @@ -101,7 +102,7 @@ class Module { std::string PresumedModuleMapFile; /// The umbrella header or directory. - llvm::PointerUnion Umbrella; + const void *Umbrella = nullptr; /// The module signature. ASTFileSignature Signature; @@ -268,6 +269,9 @@ class Module { /// to a regular (public) module map. unsigned ModuleMapIsPrivate : 1; + /// Whether Umbrella is a directory or header. + unsigned HasUmbrellaDir : 1; + /// Describes the visibility of the various names within a /// particular module. enum NameVisibilityKind { @@ -487,22 +491,18 @@ class Module { /// Retrieve the header that serves as the umbrella header for this /// module. Header getUmbrellaHeader() const { - if (auto *E = Umbrella.dyn_cast()) - return Header{UmbrellaAsWritten, E}; + if (!HasUmbrellaDir) + return Header{UmbrellaAsWritten, + static_cast(Umbrella)}; return Header{}; } /// Determine whether this module has an umbrella directory that is /// not based on an umbrella header. - bool hasUmbrellaDir() const { - return Umbrella && Umbrella.is(); - } + bool hasUmbrellaDir() const { return Umbrella && HasUmbrellaDir; } /// Add a top-level header associated with this module. - void addTopHeader(const FileEntry *File) { - assert(File); - TopHeaders.insert(File); - } + void addTopHeader(const FileEntry *File); /// Add a top-level header filename associated with this module. void addTopHeaderFilename(StringRef Filename) { diff --git a/clang/include/clang/Serialization/ModuleFile.h b/clang/include/clang/Serialization/ModuleFile.h index 8f3eb022063733..90d2745e080c81 100644 --- a/clang/include/clang/Serialization/ModuleFile.h +++ b/clang/include/clang/Serialization/ModuleFile.h @@ -14,6 +14,7 @@ #ifndef LLVM_CLANG_SERIALIZATION_MODULEFILE_H #define LLVM_CLANG_SERIALIZATION_MODULEFILE_H +#include "clang/Basic/FileManager.h" #include "clang/Basic/Module.h" #include "clang/Basic/SourceLocation.h" #include "clang/Serialization/ASTBitCodes.h" @@ -34,8 +35,6 @@ namespace clang { -class FileEntry; - namespace serialization { /// Specifies the kind of module that has been loaded. diff --git a/clang/lib/Basic/Module.cpp b/clang/lib/Basic/Module.cpp index 92835c9aca7d65..7fb6dee0ec8bed 100644 --- a/clang/lib/Basic/Module.cpp +++ b/clang/lib/Basic/Module.cpp @@ -44,7 +44,7 @@ Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent, InferSubmodules(false), InferExplicitSubmodules(false), InferExportWildcard(false), ConfigMacrosExhaustive(false), NoUndeclaredIncludes(false), ModuleMapIsPrivate(false), - NameVisibility(Hidden) { + HasUmbrellaDir(false), NameVisibility(Hidden) { if (Parent) { if (!Parent->isAvailable()) IsAvailable = false; @@ -239,7 +239,12 @@ Module::DirectoryName Module::getUmbrellaDir() const { if (Header U = getUmbrellaHeader()) return {"", U.Entry->getDir()}; - return {UmbrellaAsWritten, Umbrella.dyn_cast()}; + return {UmbrellaAsWritten, static_cast(Umbrella)}; +} + +void Module::addTopHeader(const FileEntry *File) { + assert(File); + TopHeaders.insert(File); } ArrayRef Module::getTopHeaders(FileManager &FileMgr) { diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 66223397716a8d..1c340f352f1fa9 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -1105,6 +1105,7 @@ void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader, Twine NameAsWritten) { Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader)); Mod->Umbrella = UmbrellaHeader; + Mod->HasUmbrellaDir = false; Mod->UmbrellaAsWritten = NameAsWritten.str(); UmbrellaDirs[UmbrellaHeader->getDir()] = Mod; @@ -1116,6 +1117,7 @@ void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader, void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir, Twine NameAsWritten) { Mod->Umbrella = UmbrellaDir; + Mod->HasUmbrellaDir = true; Mod->UmbrellaAsWritten = NameAsWritten.str(); UmbrellaDirs[UmbrellaDir] = Mod; }