19#include "llvm/ADT/StringExtras.h"
27 bool FromInclude =
false) {
30 if (
auto *LSD = dyn_cast<LinkageSpecDecl>(DC)) {
31 switch (LSD->getLanguage()) {
32 case LinkageSpecLanguageIDs::C:
34 ExternCLoc = LSD->getBeginLoc();
36 case LinkageSpecLanguageIDs::CXX:
42 while (isa<LinkageSpecDecl>(DC) || isa<ExportDecl>(DC))
45 if (!isa<TranslationUnitDecl>(DC)) {
47 ? diag::ext_module_import_not_at_top_level_noop
48 : diag::err_module_import_not_at_top_level_fatal)
50 S.
Diag(cast<Decl>(DC)->getBeginLoc(),
51 diag::note_module_import_not_at_top_level)
54 S.
Diag(ImportLoc, diag::ext_module_import_in_extern_c)
56 S.
Diag(ExternCLoc, diag::note_extern_c_begins_here);
69 for (
auto &Piece :
Path) {
72 Name += Piece.first->getName();
87 Module *&FoundPrimaryModuleInterface) {
98 if (FoundPrimaryModuleInterface)
99 return Imported == FoundPrimaryModuleInterface;
114 assert(!FoundPrimaryModuleInterface ||
115 FoundPrimaryModuleInterface == Imported);
116 FoundPrimaryModuleInterface = Imported;
133 bool IsImportingPrimaryModuleInterface =
false) {
135 "'makeTransitiveImportsVisible()' is intended for standard C++ named "
139 Worklist.push_back(Imported);
141 Module *FoundPrimaryModuleInterface =
142 IsImportingPrimaryModuleInterface ? Imported :
nullptr;
144 while (!Worklist.empty()) {
145 Module *Importing = Worklist.pop_back_val();
152 VisibleModules.
setVisible(Importing, ImportLoc);
155 FoundPrimaryModuleInterface))
157 if (!VisibleModules.
isVisible(TransImported))
158 Worklist.push_back(TransImported);
166 PushGlobalModuleFragment(ModuleLoc);
178 TU->setLocalOwningModule(GlobalModule);
184void Sema::HandleStartOfHeaderUnit() {
186 "Header units are only valid for C++20 modules");
191 if (HUName.empty()) {
206 assert(F &&
"failed to find the header unit source?");
209 Module *Mod = Map.createHeaderUnit(StartOfTU, HUName, H);
210 assert(Mod &&
"module creation should not fail");
211 ModuleScopes.push_back({});
212 ModuleScopes.back().BeginLoc = StartOfTU;
213 ModuleScopes.back().Module = Mod;
220 TU->setLocalOwningModule(Mod);
234 if (II->
isStr(
"module") || II->
isStr(
"import"))
250 return S.
Diag(
Loc, diag::err_invalid_module_name) << II;
252 S.
Diag(
Loc, diag::warn_reserved_module_name) << II;
255 llvm_unreachable(
"fell off a fully covered switch");
263 "should only have module decl in standard C++ modules");
271 bool IsPartition = !Partition.empty();
281 llvm_unreachable(
"how did we get a partition type set?");
300 Diag(ModuleLoc, diag::err_module_interface_implementation_mismatch)
306 Diag(ModuleLoc, diag::err_module_decl_in_module_map_module);
310 Diag(ModuleLoc, diag::err_module_decl_in_header_unit);
314 assert(ModuleScopes.size() <= 1 &&
"expected to be at global module scope");
320 if (isCurrentModulePurview()) {
321 Diag(ModuleLoc, diag::err_module_redeclaration);
323 diag::note_prev_module_declaration);
328 SeenGMF == (
bool)this->TheGlobalModuleFragment) &&
329 "mismatched global module state");
333 if (
getLangOpts().CPlusPlusModules && !IsFirstDecl && !SeenGMF) {
334 Diag(ModuleLoc, diag::err_module_decl_not_at_start);
338 : ModuleScopes.back().BeginLoc;
340 Diag(BeginLoc, diag::note_global_module_introducer_missing)
354 StringRef FirstComponentName =
Path[0].first->getName();
356 (FirstComponentName ==
"std" ||
357 (FirstComponentName.starts_with(
"std") &&
358 llvm::all_of(FirstComponentName.drop_front(3), &llvm::isDigit))))
359 Diag(
Path[0].second, diag::warn_reserved_module_name) <<
Path[0].first;
363 for (
auto Part :
Path) {
380 Diag(
Path.front().second, diag::err_current_module_name_mismatch)
382 ? Partition.back().second
383 :
Path.back().second)
397 if (
auto *M = Map.findModule(ModuleName)) {
398 Diag(
Path[0].second, diag::err_module_redefinition) << ModuleName;
399 if (M->DefinitionLoc.isValid())
400 Diag(M->DefinitionLoc, diag::note_prev_module_definition);
402 Diag(M->DefinitionLoc, diag::note_prev_module_definition_from_ast_file)
409 Mod = Map.createModuleForInterfaceUnit(ModuleLoc, ModuleName);
412 assert(Mod &&
"module creation should not fail");
421 std::pair<IdentifierInfo *, SourceLocation> ModuleNameLoc(
435 Diag(ModuleLoc, diag::err_module_not_defined) << ModuleName;
437 Mod = Map.createModuleForInterfaceUnit(ModuleLoc, ModuleName);
439 Mod = Map.createModuleForImplementationUnit(ModuleLoc, ModuleName);
446 Mod = Map.createModuleForInterfaceUnit(ModuleLoc, ModuleName);
451 if (!this->TheGlobalModuleFragment) {
452 ModuleScopes.push_back({});
454 ModuleScopes.back().OuterVisibleModules = std::move(VisibleModules);
461 ModuleScopes.back().BeginLoc = StartLoc;
462 ModuleScopes.back().Module = Mod;
472 TU->setLocalOwningModule(Mod);
481 Listener->EnteringModulePurview();
518 : ModuleScopes.back().Module->Kind) {
525 Diag(PrivateLoc, diag::err_private_module_fragment_not_module);
529 Diag(PrivateLoc, diag::err_private_module_fragment_redefined);
530 Diag(ModuleScopes.back().BeginLoc, diag::note_previous_definition);
534 Diag(PrivateLoc, diag::err_private_module_fragment_not_module_interface);
535 Diag(ModuleScopes.back().BeginLoc,
536 diag::note_not_module_interface_add_export)
552 Module *PrivateModuleFragment =
553 Map.createPrivateModuleFragmentForInterfaceUnit(
554 ModuleScopes.back().Module, PrivateLoc);
555 assert(PrivateModuleFragment &&
"module creation should not fail");
558 ModuleScopes.push_back({});
559 ModuleScopes.back().BeginLoc = ModuleLoc;
560 ModuleScopes.back().Module = PrivateModuleFragment;
561 VisibleModules.
setVisible(PrivateModuleFragment, ModuleLoc);
568 TU->setLocalOwningModule(PrivateModuleFragment);
578 assert((!IsPartition ||
getLangOpts().CPlusPlusModules) &&
579 "partition seen in non-C++20 code?");
583 std::pair<IdentifierInfo *, SourceLocation> ModuleNameLoc;
585 std::string ModuleName;
588 assert(!ModuleScopes.empty() &&
"in a module purview, but no module?");
589 Module *NamedMod = ModuleScopes.back().Module;
610 if (
getLangOpts().CPlusPlusModules && isCurrentModulePurview() &&
612 Diag(ImportLoc, diag::err_module_self_import_cxx20)
624 Diag(ImportLoc, diag::err_module_import_non_interface_nor_parition)
635 if (
auto *ED = dyn_cast<ExportDecl>(DC))
645 Diag(ImportLoc, diag::warn_experimental_header_unit);
661 ? diag::err_module_self_import
662 : diag::err_module_import_in_implementation)
672 for (
Module *ModCheck = Mod; ModCheck; ModCheck = ModCheck->
Parent)
676 IdentifierLocs.push_back(
Path[0].second);
679 for (
unsigned I = 0, N =
Path.size(); I != N; ++I) {
684 ModCheck = ModCheck->
Parent;
686 IdentifierLocs.push_back(
Path[I].second);
691 Mod, IdentifierLocs);
696 if (!ModuleScopes.empty())
702 Diag(ExportLoc, diag::err_export_partition_impl)
712 }
else if (ExportLoc.
isValid()) {
716 Diag(ExportLoc, diag::err_export_not_in_module_interface);
733 bool IsInModuleIncludes =
739 if (
getLangOpts().Modules && !IsInModuleIncludes) {
744 if (!ModuleScopes.empty())
755 getLangOpts().CurrentModule, DirectiveLoc,
false,
false);
757 assert(ThisModule &&
"was expecting a module if building one");
764 ModuleScopes.push_back({});
765 ModuleScopes.back().Module = Mod;
767 ModuleScopes.back().OuterVisibleModules = std::move(VisibleModules);
776 cast<Decl>(DC)->setModuleOwnershipKind(
780 cast<Decl>(DC)->setLocalOwningModule(Mod);
787 VisibleModules = std::move(ModuleScopes.back().OuterVisibleModules);
793 assert(!ModuleScopes.empty() && ModuleScopes.back().Module == Mod &&
794 "left the wrong module scope");
795 ModuleScopes.pop_back();
804 "end of submodule in main source file");
808 DirectiveLoc = EomLoc;
819 cast<Decl>(DC)->setModuleOwnershipKind(
849 D->setRBraceLoc(LBraceLoc);
859 if (!isCurrentModulePurview()) {
860 Diag(ExportLoc, diag::err_export_not_in_module_interface) << 0;
864 Diag(ExportLoc, diag::err_export_not_in_module_interface) << 1;
865 Diag(ModuleScopes.back().BeginLoc,
866 diag::note_not_module_interface_add_export)
870 }
else if (ModuleScopes.back().Module->Kind ==
872 Diag(ExportLoc, diag::err_export_in_private_module_fragment);
873 Diag(ModuleScopes.back().BeginLoc, diag::note_private_module_fragment);
880 if (
const auto *ND = dyn_cast<NamespaceDecl>(DC)) {
883 if (ND->isAnonymousNamespace()) {
884 Diag(ExportLoc, diag::err_export_within_anonymous_namespace);
885 Diag(ND->getLocation(), diag::note_anonymous_namespace);
896 if (!
getLangOpts().
HLSL && !DeferredExportedNamespaces.insert(ND).second)
904 Diag(ExportLoc, diag::err_export_within_export);
906 Diag(ED->getLocation(), diag::note_export);
922 bool AllUnnamed =
true;
923 for (
auto *
D : DC->
decls())
934 if (!dyn_cast<FunctionDecl>(
D) && !dyn_cast<ExportDecl>(
D)) {
943 bool HasName =
false;
944 if (
auto *ND = dyn_cast<NamedDecl>(
D)) {
947 HasName = (
bool)ND->getDeclName();
949 S.
Diag(ND->getLocation(), diag::err_export_internal) << ND;
951 S.
Diag(BlockStart, diag::note_export);
959 if (
auto *USD = dyn_cast<UsingShadowDecl>(
D)) {
963 S.
Diag(USD->getLocation(), diag::err_export_using_internal)
965 S.
Diag(
Target->getLocation(), diag::note_using_decl_target);
967 S.
Diag(BlockStart, diag::note_export);
974 if (
auto *DC = dyn_cast<DeclContext>(
D)) {
975 if (!isa<NamespaceDecl>(
D))
978 if (
auto *ND = dyn_cast<NamedDecl>(
D)) {
979 if (!ND->getDeclName()) {
980 S.
Diag(ND->getLocation(), diag::err_export_anon_ns_internal);
982 S.
Diag(BlockStart, diag::note_export);
984 }
else if (!DC->decls().empty() &&
985 DC->getRedeclContext()->isFileContext()) {
994 auto *ED = cast<ExportDecl>(
D);
996 ED->setRBraceLoc(RBraceLoc);
1003 for (
auto *Child : ED->decls()) {
1005 if (
auto *FD = dyn_cast<FunctionDecl>(Child)) {
1013 if (FD->isInlineSpecified() && !FD->isDefined())
1014 PendingInlineFuncDecls.insert(FD);
1020 for (
auto *Exported : ED->decls())
1029 if (!TheGlobalModuleFragment) {
1035 assert(TheGlobalModuleFragment &&
"module creation should not fail");
1038 ModuleScopes.push_back({BeginLoc, TheGlobalModuleFragment,
1040 VisibleModules.
setVisible(TheGlobalModuleFragment, BeginLoc);
1042 return TheGlobalModuleFragment;
1045void Sema::PopGlobalModuleFragment() {
1046 assert(!ModuleScopes.empty() &&
1048 "left the wrong module scope, which is not global module fragment");
1049 ModuleScopes.pop_back();
1053 if (!TheImplicitGlobalModuleFragment) {
1055 TheImplicitGlobalModuleFragment =
1059 assert(TheImplicitGlobalModuleFragment &&
"module creation should not fail");
1062 ModuleScopes.push_back({BeginLoc, TheImplicitGlobalModuleFragment,
1064 VisibleModules.
setVisible(TheImplicitGlobalModuleFragment, BeginLoc);
1065 return TheImplicitGlobalModuleFragment;
1068void Sema::PopImplicitGlobalModuleFragment() {
1069 assert(!ModuleScopes.empty() &&
1071 "left the wrong module scope, which is not global module fragment");
1072 ModuleScopes.pop_back();
1075bool Sema::isCurrentModulePurview()
const {
llvm::MachO::Target Target
Defines the clang::Preprocessor interface.
static void makeTransitiveImportsVisible(ASTContext &Ctx, VisibleModuleSet &VisibleModules, Module *Imported, Module *CurrentModule, SourceLocation ImportLoc, bool IsImportingPrimaryModuleInterface=false)
[module.import]p7: Additionally, when a module-import-declaration in a module unit of some module M i...
static bool DiagReservedModuleName(Sema &S, const IdentifierInfo *II, SourceLocation Loc)
Tests whether the given identifier is reserved as a module name and diagnoses if it is.
static const ExportDecl * getEnclosingExportDecl(const Decl *D)
Determine whether D is lexically within an export-declaration.
static bool checkExportedDecl(Sema &, Decl *, SourceLocation)
Check that it's valid to export D.
static std::string stringFromPath(ModuleIdPath Path)
static void checkModuleImportContext(Sema &S, Module *M, SourceLocation ImportLoc, DeclContext *DC, bool FromInclude=false)
static bool checkExportedDeclContext(Sema &S, DeclContext *DC, SourceLocation BlockStart)
Check that it's valid to export all the declarations in DC.
static bool isImportingModuleUnitFromSameModule(ASTContext &Ctx, Module *Imported, Module *CurrentModule, Module *&FoundPrimaryModuleInterface)
Helper function for makeTransitiveImportsVisible to decide whether the.
virtual void HandleImplicitImportDecl(ImportDecl *D)
Handle an ImportDecl that was implicitly created due to an inclusion directive.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
void setCurrentNamedModule(Module *M)
Set the (C++20) module we are building.
void addModuleInitializer(Module *M, Decl *Init)
Add a declaration to the list of declarations that are initialized for a module.
bool isInSameModule(const Module *M1, const Module *M2)
If the two module M1 and M2 are in the same module.
The result of parsing/analyzing an expression, statement etc.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
void addDecl(Decl *D)
Add the declaration D into this context.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Decl - This represents one declaration (or definition), e.g.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isInvalidDecl() const
SourceLocation getBeginLoc() const LLVM_READONLY
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
@ Unowned
This declaration is not owned by a module.
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
@ ModulePrivate
This declaration has an owning module, but is only visible to lookups that occur within that module.
@ Visible
This declaration has an owning module, but is globally visible (typically because its owning module i...
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
Represents a standard C++ module export declaration.
static ExportDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExportLoc)
StringRef getName() const
The name of this FileEntry.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
Get a FileEntryRef if it exists, without doing anything on error.
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
One of these records is kept for each identifier that is lexed.
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine whether this is a name reserved for the implementation (C99 7.1.3, C++ [lib....
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
static ImportDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, Module *Imported, ArrayRef< SourceLocation > IdentifierLocs)
Create a new module import declaration.
static ImportDecl * CreateImplicit(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, Module *Imported, SourceLocation EndLoc)
Create a new module import declaration for an implicitly-generated import.
@ CMK_None
Not compiling a module interface at all.
@ CMK_HeaderUnit
Compiling a module header unit.
@ CMK_ModuleMap
Compiling a module from a module map.
@ CMK_ModuleInterface
Compiling a C++ modules interface unit.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
std::string CurrentModule
The name of the current module, of which the main source file is a part.
virtual ModuleLoadResult loadModule(SourceLocation ImportLoc, ModuleIdPath Path, Module::NameVisibilityKind Visibility, bool IsInclusionDirective)=0
Attempt to load the given module.
virtual void makeModuleVisible(Module *Mod, Module::NameVisibilityKind Visibility, SourceLocation ImportLoc)=0
Make the given module visible.
Module * createGlobalModuleFragmentForModuleUnit(SourceLocation Loc, Module *Parent=nullptr)
Create a global module fragment for a C++ module unit.
Module * createImplicitGlobalModuleFragmentForModuleUnit(SourceLocation Loc, Module *Parent)
Describes a module or submodule.
SmallVector< ExportDecl, 2 > Exports
The set of export declarations.
bool isForBuilding(const LangOptions &LangOpts) const
Determine whether this module can be built in this compilation.
bool isInterfaceOrPartition() const
bool isModulePartitionImplementation() const
Is this a module partition implementation unit.
@ AllVisible
All of the names in this module are visible.
Module * Parent
The parent of this module.
ModuleKind Kind
The kind of this module.
llvm::SmallSetVector< Module *, 2 > Imports
The set of modules imported by this module, and on which this module depends.
unsigned IsExternC
Whether this is an 'extern "C"' module (which implicitly puts all headers in it within an 'extern "C"...
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
bool isModulePartition() const
Is this a module partition.
bool isHeaderUnit() const
Is this module a header unit.
@ ModuleImplementationUnit
This is a C++20 module implementation unit.
@ ModuleMapModule
This is a module that was defined by a module map and built out of header files.
@ ImplicitGlobalModuleFragment
This is an implicit fragment of the global module which contains only language linkage declarations (...
@ ModulePartitionInterface
This is a C++20 module partition interface.
@ ModuleInterfaceUnit
This is a C++20 module interface unit.
@ ModuleHeaderUnit
This is a C++20 header unit.
@ ModulePartitionImplementation
This is a C++20 module partition implementation.
@ PrivateModuleFragment
This is the private module fragment within some C++ module.
@ ExplicitGlobalModuleFragment
This is the explicit Global Module Fragment of a modular TU.
std::string getFullModuleName(bool AllowStringLiterals=false) const
Retrieve the full name of this module, including the path from its top-level module.
bool isNamedModule() const
Does this Module is a named module of a standard named module?
This represents a decl that may have a name.
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
Wrapper for void* pointer.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
HeaderSearch & getHeaderSearchInfo() const
Scope - A scope is a transient data structure that is used while parsing the program.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
Sema - This implements semantic analysis and AST building for C.
void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod)
The parsed has entered a submodule.
void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod)
The parser has processed a module import translated from a #include or similar preprocessing directiv...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
@ PartitionImplementation
'module X:Y;'
@ Interface
'export module X;'
@ Implementation
'module X;'
@ PartitionInterface
'export module X:Y;'
DeclGroupPtrTy ActOnModuleDecl(SourceLocation StartLoc, SourceLocation ModuleLoc, ModuleDeclKind MDK, ModuleIdPath Path, ModuleIdPath Partition, ModuleImportState &ImportState)
The parser has processed a module-declaration that begins the definition of a module interface or imp...
llvm::DenseMap< NamedDecl *, NamedDecl * > VisibleNamespaceCache
Map from the most recent declaration of a namespace to the most recent visible declaration of that na...
void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod)
The parser has left a submodule.
bool currentModuleIsImplementation() const
Is the module scope we are an implementation unit?
DeclResult ActOnModuleImport(SourceLocation StartLoc, SourceLocation ExportLoc, SourceLocation ImportLoc, ModuleIdPath Path, bool IsPartition=false)
The parser has processed a module import declaration.
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
ASTContext & getASTContext() const
Decl * ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc, SourceLocation LBraceLoc)
We have parsed the start of an export declaration, including the '{' (if present).
const LangOptions & getLangOpts() const
void ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind)
DeclGroupPtrTy ActOnGlobalModuleFragmentDecl(SourceLocation ModuleLoc)
The parser has processed a global-module-fragment declaration that begins the definition of the globa...
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
DeclGroupPtrTy ActOnPrivateModuleFragmentDecl(SourceLocation ModuleLoc, SourceLocation PrivateLoc)
The parser has processed a private-module-fragment declaration that begins the definition of the priv...
SourceManager & getSourceManager() const
void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod)
bool isModuleVisible(const Module *M, bool ModulePrivate=false)
@ Global
The global module fragment, between 'module;' and a module-declaration.
@ Normal
A normal translation unit fragment.
ModuleImportState
An enumeration to represent the transition of states in parsing module fragments and imports.
@ FirstDecl
Parsing the first decl in a TU.
@ GlobalFragment
after 'module;' but before 'module X;'
@ NotACXX20Module
Not a C++20 TU, or an invalid state was found.
@ ImportAllowed
after 'module X;' but before any non-import decl.
ModuleLoader & getModuleLoader() const
Retrieve the module loader associated with the preprocessor.
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
SourceManager & SourceMgr
Decl * ActOnFinishExportDecl(Scope *S, Decl *ExportDecl, SourceLocation RBraceLoc)
Complete the definition of an export declaration.
ASTMutationListener * getASTMutationListener() const
void createImplicitModuleImportForErrorRecovery(SourceLocation Loc, Module *Mod)
Create an implicit import of the given module at the given source location, for error recovery,...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
FileID getFileID(SourceLocation SpellingLoc) const
Return the FileID for a SourceLocation.
OptionalFileEntryRef getFileEntryRefForID(FileID FID) const
Returns the FileEntryRef for the provided FileID.
FileManager & getFileManager() const
FileID getMainFileID() const
Returns the FileID of the main source file.
SourceLocation getIncludeLoc(FileID FID) const
Returns the include location if FID is a #include'd file otherwise it returns an invalid location.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
SourceLocation getLocForStartOfFile(FileID FID) const
Return the source location corresponding to the first byte of the specified file.
bool isWrittenInMainFile(SourceLocation Loc) const
Returns true if the spelling location for the given location is in the main file buffer.
A trivial tuple used to represent a source range.
The top declaration context.
A set of visible modules.
SourceLocation getImportLoc(const Module *M) const
Get the location at which the import of a module was triggered.
bool isVisible(const Module *M) const
Determine whether a module is visible.
void setVisible(Module *M, SourceLocation Loc, VisibleCallback Vis=[](Module *) {}, ConflictCallback Cb=[](ArrayRef< Module * >, Module *, StringRef) {})
Make a specific module visible.
The JSON file list parser is used to communicate input to InstallAPI.
ArrayRef< std::pair< IdentifierInfo *, SourceLocation > > ModuleIdPath
A sequence of identifier/location pairs used to describe a particular module or submodule,...
Linkage
Describes the different kinds of linkage (C++ [basic.link], C99 6.2.2) that an entity may have.
@ Internal
Internal linkage, which indicates that the entity can be referred to from within the translation unit...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
@ TU_ClangModule
The translation unit is a clang module.