https://github.com/Decodetalkers updated 
https://github.com/llvm/llvm-project/pull/204511

>From 248f8b05881b0159b26d4f11c0e69033403d388d Mon Sep 17 00:00:00 2001
From: ShootingStarDragons <[email protected]>
Date: Thu, 18 Jun 2026 14:46:31 +0900
Subject: [PATCH] feat: highlight for import, export keyword

This pr aims to add highlight for import and export keyword
And induced new SemanticHighlight `keyword`
---
 clang-tools-extra/clangd/FindTarget.cpp       | 13 +++-
 .../clangd/SemanticHighlighting.cpp           |  6 ++
 .../clangd/SemanticHighlighting.h             |  1 +
 clang/include/clang/AST/Decl.h                | 58 +++++++++++----
 clang/include/clang/Sema/Sema.h               | 27 ++++---
 clang/lib/AST/Decl.cpp                        | 70 +++++++++---------
 clang/lib/Parse/ParseDeclCXX.cpp              | 11 ++-
 clang/lib/Parse/Parser.cpp                    | 71 ++++++++++--------
 clang/lib/Sema/SemaLookup.cpp                 | 19 ++---
 clang/lib/Sema/SemaModule.cpp                 | 74 +++++++++++--------
 10 files changed, 216 insertions(+), 134 deletions(-)

diff --git a/clang-tools-extra/clangd/FindTarget.cpp 
b/clang-tools-extra/clangd/FindTarget.cpp
index 41c9cddfebbbc..4ac77a884c70b 100644
--- a/clang-tools-extra/clangd/FindTarget.cpp
+++ b/clang-tools-extra/clangd/FindTarget.cpp
@@ -619,7 +619,18 @@ llvm::SmallVector<ReferenceLoc> refInDecl(const Decl *D,
                                   /*IsDecl=*/false,
                                   {D->getNominatedNamespaceAsWritten()}});
     }
-
+    void VisitImportDecl(const ImportDecl *D) {
+      Refs.push_back(ReferenceLoc{D->getQualifierLoc(),
+                                  D->getIdentLocation(),
+                                  /*IsDecl=*/true,
+                                  {D}});
+    }
+    void VisitExportDecl(const ExportDecl *D) {
+      Refs.push_back(ReferenceLoc{D->getQualifierLoc(),
+                                  D->getIdentLocation(),
+                                  /*IsDecl=*/true,
+                                  {D}});
+    }
     void VisitUsingDecl(const UsingDecl *D) {
       // "using ns::identifier;" is a non-declaration reference.
       Refs.push_back(ReferenceLoc{
diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp 
b/clang-tools-extra/clangd/SemanticHighlighting.cpp
index 856904bc810d1..c84039fd8492d 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -122,6 +122,8 @@ std::optional<HighlightingKind> kindForDecl(const NamedDecl 
*D,
                                 : HighlightingKind::Method;
   if (isa<FieldDecl, IndirectFieldDecl, ObjCPropertyDecl>(D))
     return HighlightingKind::Field;
+  if (isa<ImportDecl, ExportDecl>(D))
+    return HighlightingKind::Keyword;
   if (isa<EnumDecl>(D))
     return HighlightingKind::Enum;
   if (isa<EnumConstantDecl>(D))
@@ -1118,6 +1120,8 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, 
HighlightingKind K) {
     return OS << "Parameter";
   case HighlightingKind::Function:
     return OS << "Function";
+  case HighlightingKind::Keyword:
+    return OS << "Keyword";
   case HighlightingKind::Method:
     return OS << "Method";
   case HighlightingKind::StaticMethod:
@@ -1323,6 +1327,8 @@ llvm::StringRef toSemanticTokenType(HighlightingKind 
Kind) {
     return "function";
   case HighlightingKind::Method:
     return "method";
+  case HighlightingKind::Keyword:
+    return "keyword";
   case HighlightingKind::StaticMethod:
     // FIXME: better method with static modifier?
     return "function";
diff --git a/clang-tools-extra/clangd/SemanticHighlighting.h 
b/clang-tools-extra/clangd/SemanticHighlighting.h
index 59d742b83ee52..3b1c12418becb 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.h
+++ b/clang-tools-extra/clangd/SemanticHighlighting.h
@@ -34,6 +34,7 @@ enum class HighlightingKind {
   Parameter,
   Function,
   Method,
+  Keyword,
   StaticMethod,
   Field,
   StaticField,
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h
index e3f513732e588..e03ee3bc1216a 100644
--- a/clang/include/clang/AST/Decl.h
+++ b/clang/include/clang/AST/Decl.h
@@ -5055,7 +5055,7 @@ class CapturedDecl final
 ///
 /// Import declarations can also be implicitly generated from
 /// \#include/\#import directives.
-class ImportDecl final : public Decl,
+class ImportDecl final : public NamedDecl,
                          llvm::TrailingObjects<ImportDecl, SourceLocation> {
   friend class ASTContext;
   friend class ASTDeclReader;
@@ -5065,6 +5065,7 @@ class ImportDecl final : public Decl,
   /// The imported module.
   Module *ImportedModule = nullptr;
 
+  NestedNameSpecifierLoc QualifierLoc;
   /// The next import in the list of imports local to the translation
   /// unit being parsed (not loaded from an AST file).
   ///
@@ -5076,12 +5077,15 @@ class ImportDecl final : public Decl,
   llvm::PointerIntPair<ImportDecl *, 1, bool> NextLocalImportAndComplete;
 
   ImportDecl(DeclContext *DC, SourceLocation StartLoc, Module *Imported,
+             NestedNameSpecifierLoc QualifierLoc, IdentifierInfo *Id,
              ArrayRef<SourceLocation> IdentifierLocs);
 
   ImportDecl(DeclContext *DC, SourceLocation StartLoc, Module *Imported,
+             NestedNameSpecifierLoc QualifierLoc, DeclarationName Id,
              SourceLocation EndLoc);
 
-  ImportDecl(EmptyShell Empty) : Decl(Import, Empty) {}
+  ImportDecl(EmptyShell Empty)
+      : NamedDecl(Import, nullptr, SourceLocation(), DeclarationName()) {}
 
   bool isImportComplete() const { return NextLocalImportAndComplete.getInt(); }
 
@@ -5100,14 +5104,17 @@ class ImportDecl final : public Decl,
 public:
   /// Create a new module import declaration.
   static ImportDecl *Create(ASTContext &C, DeclContext *DC,
+                            NestedNameSpecifierLoc QualifierLoc,
                             SourceLocation StartLoc, Module *Imported,
+                            IdentifierInfo *Id,
                             ArrayRef<SourceLocation> IdentifierLocs);
 
   /// Create a new module import declaration for an implicitly-generated
   /// import.
   static ImportDecl *CreateImplicit(ASTContext &C, DeclContext *DC,
                                     SourceLocation StartLoc, Module *Imported,
-                                    SourceLocation EndLoc);
+                                    NestedNameSpecifierLoc QualifierLoc,
+                                    DeclarationName Id, SourceLocation EndLoc);
 
   /// Create a new, deserialized module import declaration.
   static ImportDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID,
@@ -5116,6 +5123,18 @@ class ImportDecl final : public Decl,
   /// Retrieve the module that was imported by the import declaration.
   Module *getImportedModule() const { return ImportedModule; }
 
+  /// Retrieve the nested-name-specifier that qualifies the
+  /// name of the namespace, with source-location information.
+  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
+
+  /// Retrieve the nested-name-specifier that qualifies the
+  /// name of the namespace.
+  NestedNameSpecifier getQualifier() const {
+    return QualifierLoc.getNestedNameSpecifier();
+  }
+
+  SourceLocation getIdentLocation() const { return getLocation(); }
+
   /// Retrieves the locations of each of the identifiers that make up
   /// the complete module name in the import declaration.
   ///
@@ -5135,22 +5154,26 @@ class ImportDecl final : public Decl,
 /// \code
 ///   export void foo();
 /// \endcode
-class ExportDecl final : public Decl, public DeclContext {
-  LLVM_DECLARE_VIRTUAL_ANCHOR_FUNCTION();
+class ExportDecl final : public NamedDecl, public DeclContext {
+  void anchor() override;
 
 private:
   friend class ASTDeclReader;
 
   /// The source location for the right brace (if valid).
   SourceLocation RBraceLoc;
+  NestedNameSpecifierLoc QualifierLoc;
 
-  ExportDecl(DeclContext *DC, SourceLocation ExportLoc)
-      : Decl(Export, DC, ExportLoc), DeclContext(Export),
-        RBraceLoc(SourceLocation()) {}
+  ExportDecl(DeclContext *DC, SourceLocation ExportLoc, 
+             NestedNameSpecifierLoc QualifierLoc, DeclarationName Id)
+      : NamedDecl(Export, DC, ExportLoc, Id), DeclContext(Export),
+        RBraceLoc(SourceLocation()), QualifierLoc(QualifierLoc) {}
 
 public:
   static ExportDecl *Create(ASTContext &C, DeclContext *DC,
-                            SourceLocation ExportLoc);
+                            SourceLocation ExportLoc,
+                            NestedNameSpecifierLoc QualifierLoc,
+                            DeclarationName Id);
   static ExportDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
 
   SourceLocation getExportLoc() const { return getLocation(); }
@@ -5170,14 +5193,24 @@ class ExportDecl final : public Decl, public 
DeclContext {
   SourceRange getSourceRange() const override LLVM_READONLY {
     return SourceRange(getLocation(), getEndLoc());
   }
+  /// Retrieve the nested-name-specifier that qualifies the
+  /// name of the namespace, with source-location information.
+  NestedNameSpecifierLoc getQualifierLoc() const { return QualifierLoc; }
+
+  /// Retrieve the nested-name-specifier that qualifies the
+  /// name of the namespace.
+  NestedNameSpecifier getQualifier() const {
+    return QualifierLoc.getNestedNameSpecifier();
+  }
 
+  SourceLocation getIdentLocation() const { return getLocation(); }
   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   static bool classofKind(Kind K) { return K == Export; }
   static DeclContext *castToDeclContext(const ExportDecl *D) {
-    return static_cast<DeclContext *>(const_cast<ExportDecl*>(D));
+    return static_cast<DeclContext *>(const_cast<ExportDecl *>(D));
   }
   static ExportDecl *castFromDeclContext(const DeclContext *DC) {
-    return static_cast<ExportDecl *>(const_cast<DeclContext*>(DC));
+    return static_cast<ExportDecl *>(const_cast<DeclContext *>(DC));
   }
 };
 
@@ -5188,8 +5221,7 @@ class EmptyDecl : public Decl {
   virtual void anchor();
 
 public:
-  static EmptyDecl *Create(ASTContext &C, DeclContext *DC,
-                           SourceLocation L);
+  static EmptyDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L);
   static EmptyDecl *CreateDeserialized(ASTContext &C, GlobalDeclID ID);
 
   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index ff474fdd99562..89c75b6fdebfc 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -9985,10 +9985,11 @@ class Sema final : public SemaBase {
 
   /// The parser has processed a module-declaration that begins the definition
   /// of a module interface or implementation.
-  DeclGroupPtrTy ActOnModuleDecl(SourceLocation StartLoc,
+  DeclGroupPtrTy ActOnModuleDecl(CXXScopeSpec *SS, SourceLocation StartLoc,
                                  SourceLocation ModuleLoc, ModuleDeclKind MDK,
                                  ModuleIdPath Path, ModuleIdPath Partition,
                                  ModuleImportState &ImportState,
+                                 IdentifierInfo *Id,
                                  bool SeenNoTrivialPPDirective);
 
   /// The parser has processed a global-module-fragment declaration that begins
@@ -10011,24 +10012,27 @@ class Sema final : public SemaBase {
   /// \param ImportLoc The location of the 'import' keyword.
   /// \param Path The module toplevel name as an access path.
   /// \param IsPartition If the name is for a partition.
-  DeclResult ActOnModuleImport(SourceLocation StartLoc,
+  DeclResult ActOnModuleImport(CXXScopeSpec *SS, SourceLocation StartLoc,
                                SourceLocation ExportLoc,
                                SourceLocation ImportLoc, ModuleIdPath Path,
-                               bool IsPartition = false);
-  DeclResult ActOnModuleImport(SourceLocation StartLoc,
+                               IdentifierInfo *Id, bool IsPartition = false);
+  DeclResult ActOnModuleImport(CXXScopeSpec *SS, SourceLocation StartLoc,
                                SourceLocation ExportLoc,
                                SourceLocation ImportLoc, Module *M,
-                               ModuleIdPath Path = {});
+                               IdentifierInfo *Id, ModuleIdPath Path = {});
 
   /// The parser has processed a module import translated from a
   /// #include or similar preprocessing directive.
-  void ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
-  void BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod);
+  void ActOnAnnotModuleInclude(CXXScopeSpec *SS, SourceLocation DirectiveLoc,
+                               IdentifierInfo *Id, Module *Mod);
+  void BuildModuleInclude(CXXScopeSpec *SS, SourceLocation DirectiveLoc,
+                          IdentifierInfo *Id, Module *Mod);
 
   /// The parsed has entered a submodule.
   void ActOnAnnotModuleBegin(SourceLocation DirectiveLoc, Module *Mod);
   /// The parser has left a submodule.
-  void ActOnAnnotModuleEnd(SourceLocation DirectiveLoc, Module *Mod);
+  void ActOnAnnotModuleEnd(CXXScopeSpec *SS, SourceLocation DirectiveLoc,
+                           IdentifierInfo *Id, Module *Mod);
 
   /// Create an implicit import of the given module at the given
   /// source location, for error recovery, if possible.
@@ -10036,12 +10040,15 @@ class Sema final : public SemaBase {
   /// This routine is typically used when an entity found by name lookup
   /// is actually hidden within a module that we know about but the user
   /// has forgotten to import.
-  void createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
+  void createImplicitModuleImportForErrorRecovery(CXXScopeSpec *SS,
+                                                  SourceLocation Loc,
+                                                  DeclarationName Id,
                                                   Module *Mod);
 
   /// We have parsed the start of an export declaration, including the '{'
   /// (if present).
-  Decl *ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
+  Decl *ActOnStartExportDecl(Scope *S, CXXScopeSpec *SS,
+                             SourceLocation ExportLoc, IdentifierInfo *Id,
                              SourceLocation LBraceLoc);
 
   /// Complete the definition of an export declaration.
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index a6de9959e0f62..a2779fd9bfa3f 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -394,8 +394,7 @@ void LinkageComputer::mergeTemplateLV(
     LinkageInfo &LV, const FunctionDecl *fn,
     const FunctionTemplateSpecializationInfo *specInfo,
     LVComputationKind computation) {
-  bool considerVisibility =
-    shouldConsiderTemplateVisibility(fn, specInfo);
+  bool considerVisibility = shouldConsiderTemplateVisibility(fn, specInfo);
 
   FunctionTemplateDecl *temp = specInfo->getTemplate();
   // Merge information from the template declaration.
@@ -705,10 +704,10 @@ LinkageComputer::getLVForNamespaceScopeDecl(const 
NamedDecl *D,
       // If we're declared in a namespace with a visibility attribute,
       // use that namespace's visibility, and it still counts as explicit.
       for (const DeclContext *DC = D->getDeclContext();
-           !isa<TranslationUnitDecl>(DC);
-           DC = DC->getParent()) {
+           !isa<TranslationUnitDecl>(DC); DC = DC->getParent()) {
         const auto *ND = dyn_cast<NamespaceDecl>(DC);
-        if (!ND) continue;
+        if (!ND)
+          continue;
         if (std::optional<Visibility> Vis =
                 getExplicitVisibility(ND, computation)) {
           LV.mergeVisibility(*Vis, true);
@@ -962,7 +961,6 @@ LinkageComputer::getLVForClassMember(const NamedDecl *D,
   if (!isExternallyVisible(classLV.getLinkage()))
     return classLV;
 
-
   // Otherwise, don't merge in classLV yet, because in certain cases
   // we need to completely ignore the visibility from it.
 
@@ -2178,7 +2176,7 @@ SourceRange VarDecl::getSourceRange() const {
   return DeclaratorDecl::getSourceRange();
 }
 
-template<typename T>
+template <typename T>
 static LanguageLinkage getDeclLanguageLinkage(const T &D) {
   // C++ [dcl.link]p1: All function types, function names with external 
linkage,
   // and variable names with external linkage have a language linkage.
@@ -2205,8 +2203,7 @@ static LanguageLinkage getDeclLanguageLinkage(const T &D) 
{
   return CXXLanguageLinkage;
 }
 
-template<typename T>
-static bool isDeclExternC(const T &D) {
+template <typename T> static bool isDeclExternC(const T &D) {
   // Since the context is ignored for class members, they can only have C++
   // language linkage or no language linkage.
   const DeclContext *DC = D.getDeclContext();
@@ -2863,8 +2860,8 @@ MemberSpecializationInfo 
*VarDecl::getMemberSpecializationInfo() const {
   return nullptr;
 }
 
-void VarDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK,
-                                         SourceLocation PointOfInstantiation) {
+void VarDecl::setTemplateSpecializationKind(
+    TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation) {
   assert((isa<VarTemplateSpecializationDecl>(this) ||
           getMemberSpecializationInfo()) &&
          "not a variable or static data member template specialization");
@@ -2872,8 +2869,7 @@ void 
VarDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK,
   if (VarTemplateSpecializationDecl *Spec =
           dyn_cast<VarTemplateSpecializationDecl>(this)) {
     Spec->setSpecializationKind(TSK);
-    if (TSK != TSK_ExplicitSpecialization &&
-        PointOfInstantiation.isValid() &&
+    if (TSK != TSK_ExplicitSpecialization && PointOfInstantiation.isValid() &&
         Spec->getPointOfInstantiation().isInvalid()) {
       Spec->setPointOfInstantiation(PointOfInstantiation);
       if (ASTMutationListener *L = getASTContext().getASTMutationListener())
@@ -2934,8 +2930,8 @@ ParmVarDecl *ParmVarDecl::Create(ASTContext &C, 
DeclContext *DC,
                                  const IdentifierInfo *Id, QualType T,
                                  TypeSourceInfo *TInfo, StorageClass S,
                                  Expr *DefArg) {
-  return new (C, DC) ParmVarDecl(ParmVar, C, DC, StartLoc, IdLoc, Id, T, TInfo,
-                                 S, DefArg);
+  return new (C, DC)
+      ParmVarDecl(ParmVar, C, DC, StartLoc, IdLoc, Id, T, TInfo, S, DefArg);
 }
 
 QualType ParmVarDecl::getOriginalType() const {
@@ -3590,9 +3586,7 @@ LanguageLinkage FunctionDecl::getLanguageLinkage() const {
   return getDeclLanguageLinkage(*this);
 }
 
-bool FunctionDecl::isExternC() const {
-  return isDeclExternC(*this);
-}
+bool FunctionDecl::isExternC() const { return isDeclExternC(*this); }
 
 bool FunctionDecl::isInExternCContext() const {
   if (DeviceKernelAttr::isOpenCLSpelling(getAttr<DeviceKernelAttr>()))
@@ -3611,8 +3605,7 @@ bool FunctionDecl::isGlobal() const {
   if (getCanonicalDecl()->getStorageClass() == SC_Static)
     return false;
 
-  for (const DeclContext *DC = getDeclContext();
-       DC->isNamespace();
+  for (const DeclContext *DC = getDeclContext(); DC->isNamespace();
        DC = DC->getParent()) {
     if (const auto *Namespace = cast<NamespaceDecl>(DC)) {
       if (!Namespace->getDeclName())
@@ -3810,7 +3803,7 @@ void FunctionDecl::setParams(ASTContext &C,
 
   // Zero params -> null pointer.
   if (!NewParamInfo.empty()) {
-    ParamInfo = new (C) ParmVarDecl*[NewParamInfo.size()];
+    ParamInfo = new (C) ParmVarDecl *[NewParamInfo.size()];
     llvm::copy(NewParamInfo, ParamInfo);
   }
 }
@@ -4929,7 +4922,7 @@ void TagDecl::startDefinition() {
 
   if (auto *D = dyn_cast<CXXRecordDecl>(this)) {
     struct CXXRecordDecl::DefinitionData *Data =
-      new (getASTContext()) struct CXXRecordDecl::DefinitionData(D);
+        new (getASTContext()) struct CXXRecordDecl::DefinitionData(D);
     for (auto *I : redecls())
       cast<CXXRecordDecl>(I)->DefinitionData = Data;
   }
@@ -5470,7 +5463,7 @@ void BlockDecl::setParams(ArrayRef<ParmVarDecl *> 
NewParamInfo) {
   // Zero params -> null pointer.
   if (!NewParamInfo.empty()) {
     NumParams = NewParamInfo.size();
-    ParamInfo = new (getASTContext()) ParmVarDecl*[NewParamInfo.size()];
+    ParamInfo = new (getASTContext()) ParmVarDecl *[NewParamInfo.size()];
     llvm::copy(NewParamInfo, ParamInfo);
   }
 }
@@ -6053,36 +6046,42 @@ static unsigned getNumModuleIdentifiers(Module *Mod) {
 }
 
 ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
-                       Module *Imported,
+                       Module *Imported, NestedNameSpecifierLoc QualifierLoc,
+                       IdentifierInfo *Id,
                        ArrayRef<SourceLocation> IdentifierLocs)
-    : Decl(Import, DC, StartLoc), ImportedModule(Imported),
-      NextLocalImportAndComplete(nullptr, true) {
+    : NamedDecl(Import, DC, StartLoc, Id), ImportedModule(Imported),
+      QualifierLoc(QualifierLoc), NextLocalImportAndComplete(nullptr, true) {
   assert(getNumModuleIdentifiers(Imported) == IdentifierLocs.size());
   auto *StoredLocs = getTrailingObjects();
   llvm::uninitialized_copy(IdentifierLocs, StoredLocs);
 }
 
 ImportDecl::ImportDecl(DeclContext *DC, SourceLocation StartLoc,
-                       Module *Imported, SourceLocation EndLoc)
-    : Decl(Import, DC, StartLoc), ImportedModule(Imported),
-      NextLocalImportAndComplete(nullptr, false) {
+                       Module *Imported, NestedNameSpecifierLoc QualifierLoc,
+                       DeclarationName Id, SourceLocation EndLoc)
+    : NamedDecl(Import, DC, StartLoc, Id), ImportedModule(Imported),
+      QualifierLoc(QualifierLoc), NextLocalImportAndComplete(nullptr, false) {
   *getTrailingObjects() = EndLoc;
 }
 
 ImportDecl *ImportDecl::Create(ASTContext &C, DeclContext *DC,
+                               NestedNameSpecifierLoc QualifierLoc,
                                SourceLocation StartLoc, Module *Imported,
+                               IdentifierInfo *Id,
                                ArrayRef<SourceLocation> IdentifierLocs) {
   return new (C, DC,
               additionalSizeToAlloc<SourceLocation>(IdentifierLocs.size()))
-      ImportDecl(DC, StartLoc, Imported, IdentifierLocs);
+      ImportDecl(DC, StartLoc, Imported, QualifierLoc, Id, IdentifierLocs);
 }
 
 ImportDecl *ImportDecl::CreateImplicit(ASTContext &C, DeclContext *DC,
                                        SourceLocation StartLoc,
                                        Module *Imported,
+                                       NestedNameSpecifierLoc QualifierLoc,
+                                       DeclarationName Id,
                                        SourceLocation EndLoc) {
   ImportDecl *Import = new (C, DC, additionalSizeToAlloc<SourceLocation>(1))
-      ImportDecl(DC, StartLoc, Imported, EndLoc);
+      ImportDecl(DC, StartLoc, Imported, QualifierLoc, Id, EndLoc);
   Import->setImplicit();
   return Import;
 }
@@ -6114,12 +6113,15 @@ SourceRange ImportDecl::getSourceRange() const {
 void ExportDecl::anchor() {}
 
 ExportDecl *ExportDecl::Create(ASTContext &C, DeclContext *DC,
-                               SourceLocation ExportLoc) {
-  return new (C, DC) ExportDecl(DC, ExportLoc);
+                               SourceLocation ExportLoc,
+                               NestedNameSpecifierLoc QualifierLoc,
+                               DeclarationName Id) {
+  return new (C, DC) ExportDecl(DC, ExportLoc, QualifierLoc, Id);
 }
 
 ExportDecl *ExportDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID) {
-  return new (C, ID) ExportDecl(nullptr, SourceLocation());
+  return new (C, ID) ExportDecl(nullptr, SourceLocation(),
+                                NestedNameSpecifierLoc(), DeclarationName());
 }
 
 bool clang::IsArmStreamingFunction(const FunctionDecl *FD,
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 86f18d10f08b0..88c461ae9c9ab 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -400,6 +400,7 @@ Decl *Parser::ParseExportDeclaration() {
   assert(Tok.is(tok::kw_export));
   SourceLocation ExportLoc = ConsumeToken();
 
+  CXXScopeSpec SS;
   if (Tok.is(tok::code_completion)) {
     cutOffParsing();
     Actions.CodeCompletion().CodeCompleteOrdinaryName(
@@ -411,7 +412,7 @@ Decl *Parser::ParseExportDeclaration() {
 
   ParseScope ExportScope(this, Scope::DeclScope);
   Decl *ExportDecl = Actions.ActOnStartExportDecl(
-      getCurScope(), ExportLoc,
+      getCurScope(), &SS, ExportLoc, Tok.getIdentifierInfo(),
       Tok.is(tok::l_brace) ? Tok.getLocation() : SourceLocation());
 
   if (Tok.isNot(tok::l_brace)) {
@@ -891,8 +892,9 @@ Decl *Parser::ParseAliasDeclarationAfterDeclarator(
   Decl *DeclFromDeclSpec = nullptr;
   TypeResult TypeAlias =
       ParseTypeName(nullptr,
-                    TemplateInfo.Kind != ParsedTemplateKind::NonTemplate ? 
DeclaratorContext::AliasTemplate
-                                      : DeclaratorContext::AliasDecl,
+                    TemplateInfo.Kind != ParsedTemplateKind::NonTemplate
+                        ? DeclaratorContext::AliasTemplate
+                        : DeclaratorContext::AliasDecl,
                     AS, &DeclFromDeclSpec, &Attrs);
   if (OwnedType)
     *OwnedType = DeclFromDeclSpec;
@@ -2231,7 +2233,8 @@ void Parser::ParseClassSpecifier(tok::TokenKind 
TagTokKind,
   // C, since definitions are not permitted in this context in C++.
   if (TUK == TagUseKind::Definition &&
       (getLangOpts().CPlusPlus || !isTypeSpecifier(DSC)) &&
-      (TemplateInfo.Kind != ParsedTemplateKind::NonTemplate || 
!isValidAfterTypeSpecifier(false))) {
+      (TemplateInfo.Kind != ParsedTemplateKind::NonTemplate ||
+       !isValidAfterTypeSpecifier(false))) {
     if (Tok.isNot(tok::semi)) {
       const PrintingPolicy &PPol = Actions.getASTContext().getPrintingPolicy();
       ExpectAndConsume(tok::semi, diag::err_expected_after,
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 5e1fd4df1a3f0..f25606e66983f 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -113,16 +113,16 @@ void Parser::SuggestParentheses(SourceLocation Loc, 
unsigned DK,
     return;
   }
 
-  Diag(Loc, DK)
-    << FixItHint::CreateInsertion(ParenRange.getBegin(), "(")
-    << FixItHint::CreateInsertion(EndLoc, ")");
+  Diag(Loc, DK) << FixItHint::CreateInsertion(ParenRange.getBegin(), "(")
+                << FixItHint::CreateInsertion(EndLoc, ")");
 }
 
 static bool IsCommonTypo(tok::TokenKind ExpectedTok, const Token &Tok) {
   switch (ExpectedTok) {
   case tok::semi:
     return Tok.is(tok::colon) || Tok.is(tok::comma); // : or , for ;
-  default: return false;
+  default:
+    return false;
   }
 }
 
@@ -139,7 +139,7 @@ bool Parser::ExpectAndConsume(tok::TokenKind ExpectedTok, 
unsigned DiagID,
     {
       DiagnosticBuilder DB = Diag(Loc, DiagID);
       DB << FixItHint::CreateReplacement(
-                SourceRange(Loc), tok::getPunctuatorSpelling(ExpectedTok));
+          SourceRange(Loc), tok::getPunctuatorSpelling(ExpectedTok));
       if (DiagID == diag::err_expected)
         DB << ExpectedTok;
       else if (DiagID == diag::err_expected_after)
@@ -615,6 +615,8 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result,
                                Sema::ModuleImportState &ImportState) {
   DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(*this);
 
+  CXXScopeSpec SS;
+
   Result = nullptr;
   switch (Tok.getKind()) {
   case tok::annot_pragma_unused:
@@ -650,10 +652,10 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result,
     // FIXME: We need a better way to disambiguate C++ clang modules and
     // standard C++ modules.
     if (!getLangOpts().CPlusPlusModules || !Mod->isHeaderUnit())
-      Actions.ActOnAnnotModuleInclude(Loc, Mod);
+      Actions.ActOnAnnotModuleInclude(&SS, Loc, Tok.getIdentifierInfo(), Mod);
     else {
-      DeclResult Import =
-          Actions.ActOnModuleImport(Loc, SourceLocation(), Loc, Mod);
+      DeclResult Import = Actions.ActOnModuleImport(
+          &SS, Loc, SourceLocation(), Loc, Mod, Tok.getIdentifierInfo());
       Decl *ImportDecl = Import.isInvalid() ? nullptr : Import.get();
       Result = Actions.ConvertDeclToDeclGroup(ImportDecl);
     }
@@ -671,7 +673,7 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result,
 
   case tok::annot_module_end:
     Actions.ActOnAnnotModuleEnd(
-        Tok.getLocation(),
+        &SS, Tok.getLocation(), Tok.getIdentifierInfo(),
         reinterpret_cast<Module *>(Tok.getAnnotationValue()));
     ConsumeAnnotationToken();
     ImportState = Sema::ModuleImportState::NotACXX20Module;
@@ -692,7 +694,7 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result,
     // Late template parsing can begin.
     Actions.SetLateTemplateParser(LateTemplateParserCallback, this);
     Actions.ActOnEndOfTranslationUnit();
-    //else don't tell Sema that we ended parsing: more input might come.
+    // else don't tell Sema that we ended parsing: more input might come.
     return true;
   default:
     break;
@@ -826,7 +828,7 @@ Parser::ParseExternalDeclaration(ParsedAttributes &Attrs,
     return nullptr;
   case tok::kw___extension__: {
     // __extension__ silences extension warnings in the subexpression.
-    ExtensionRAIIObject O(Diags);  // Use RAII to do this.
+    ExtensionRAIIObject O(Diags); // Use RAII to do this.
     ConsumeToken();
     return ParseExternalDeclaration(Attrs, DeclSpecAttrs);
   }
@@ -931,8 +933,7 @@ Parser::ParseExternalDeclaration(ParsedAttributes &Attrs,
     // Parse (then ignore) 'static' prior to a template instantiation. This is
     // a GCC extension that we intentionally do not support.
     if (getLangOpts().CPlusPlus && NextToken().is(tok::kw_template)) {
-      Diag(ConsumeToken(), diag::warn_static_inline_explicit_inst_ignored)
-        << 0;
+      Diag(ConsumeToken(), diag::warn_static_inline_explicit_inst_ignored) << 
0;
       SourceLocation DeclEnd;
       return ParseDeclaration(DeclaratorContext::File, DeclEnd, Attrs,
                               DeclSpecAttrs);
@@ -954,7 +955,7 @@ Parser::ParseExternalDeclaration(ParsedAttributes &Attrs,
       // a GCC extension that we intentionally do not support.
       if (NextKind == tok::kw_template) {
         Diag(ConsumeToken(), diag::warn_static_inline_explicit_inst_ignored)
-          << 1;
+            << 1;
         SourceLocation DeclEnd;
         return ParseDeclaration(DeclaratorContext::File, DeclEnd, Attrs,
                                 DeclSpecAttrs);
@@ -969,9 +970,10 @@ Parser::ParseExternalDeclaration(ParsedAttributes &Attrs,
       // Extern templates
       SourceLocation ExternLoc = ConsumeToken();
       SourceLocation TemplateLoc = ConsumeToken();
-      Diag(ExternLoc, getLangOpts().CPlusPlus11 ?
-             diag::warn_cxx98_compat_extern_template :
-             diag::ext_extern_template) << SourceRange(ExternLoc, TemplateLoc);
+      Diag(ExternLoc, getLangOpts().CPlusPlus11
+                          ? diag::warn_cxx98_compat_extern_template
+                          : diag::ext_extern_template)
+          << SourceRange(ExternLoc, TemplateLoc);
       SourceLocation DeclEnd;
       return ParseExplicitInstantiation(DeclaratorContext::File, ExternLoc,
                                         TemplateLoc, DeclEnd, Attrs);
@@ -1499,12 +1501,12 @@ void Parser::ParseKNRParamDeclarations(Declarator &D) {
 
         // Scan the argument list looking for the correct param to apply this
         // type.
-        for (unsigned i = 0; ; ++i) {
+        for (unsigned i = 0;; ++i) {
           // C99 6.9.1p6: those declarators shall declare only identifiers from
           // the identifier list.
           if (i == FTI.NumParams) {
             Diag(ParmDeclarator.getIdentifierLoc(), 
diag::err_no_matching_param)
-              << ParmDeclarator.getIdentifier();
+                << ParmDeclarator.getIdentifier();
             break;
           }
 
@@ -1513,7 +1515,7 @@ void Parser::ParseKNRParamDeclarations(Declarator &D) {
             if (FTI.Params[i].Param) {
               Diag(ParmDeclarator.getIdentifierLoc(),
                    diag::err_param_redefinition)
-                 << ParmDeclarator.getIdentifier();
+                  << ParmDeclarator.getIdentifier();
             } else {
               FTI.Params[i].Param = Param;
             }
@@ -2009,10 +2011,9 @@ bool Parser::TryAnnotateTypeOrScopeTokenAfterScopeSpec(
         // Consume the name.
         SourceLocation IdentifierLoc = ConsumeToken();
         SourceLocation NewEndLoc;
-        TypeResult NewType
-          = parseObjCTypeArgsAndProtocolQualifiers(IdentifierLoc, Ty,
-                                                   /*consumeLastToken=*/false,
-                                                   NewEndLoc);
+        TypeResult NewType = parseObjCTypeArgsAndProtocolQualifiers(
+            IdentifierLoc, Ty,
+            /*consumeLastToken=*/false, NewEndLoc);
         if (NewType.isUsable())
           Ty = NewType.get();
         else if (Tok.is(tok::eof)) // Nothing to do here, bail out...
@@ -2327,6 +2328,7 @@ Parser::ParseModuleDecl(Sema::ModuleImportState 
&ImportState) {
 
   SourceLocation ModuleLoc = ConsumeToken();
 
+  CXXScopeSpec SS;
   // Attributes appear after the module name, not before.
   // FIXME: Suggest moving the attributes later with a fixit.
   DiagnoseAndSkipCXX11Attributes();
@@ -2397,8 +2399,8 @@ Parser::ParseModuleDecl(Sema::ModuleImportState 
&ImportState) {
                            tok::getKeywordSpelling(tok::kw_module)))
     SkipUntil(tok::semi);
 
-  return Actions.ActOnModuleDecl(StartLoc, ModuleLoc, MDK, Path, Partition,
-                                 ImportState,
+  return Actions.ActOnModuleDecl(&SS, StartLoc, ModuleLoc, MDK, Path, 
Partition,
+                                 ImportState, Tok.getIdentifierInfo(),
                                  Introducer.hasSeenNoTrivialPPDirective());
 }
 
@@ -2415,6 +2417,8 @@ Decl *Parser::ParseModuleImport(SourceLocation AtLoc,
   bool IsObjCAtImport = Tok.isObjCAtKeyword(tok::objc_import);
   SourceLocation ImportLoc = ConsumeToken();
 
+  CXXScopeSpec SS;
+
   // For C++20 modules, we can have "name" or ":Partition name" as valid input.
   SmallVector<IdentifierLoc, 2> Path;
   bool IsPartition = false;
@@ -2522,11 +2526,12 @@ Decl *Parser::ParseModuleImport(SourceLocation AtLoc,
 
   DeclResult Import;
   if (HeaderUnit)
-    Import =
-        Actions.ActOnModuleImport(StartLoc, ExportLoc, ImportLoc, HeaderUnit);
+    Import = Actions.ActOnModuleImport(&SS, StartLoc, ExportLoc, ImportLoc,
+                                       HeaderUnit, Tok.getIdentifierInfo());
   else if (!Path.empty())
-    Import = Actions.ActOnModuleImport(StartLoc, ExportLoc, ImportLoc, Path,
-                                       IsPartition);
+    Import =
+        Actions.ActOnModuleImport(&SS, StartLoc, ExportLoc, ImportLoc, Path,
+                                  Tok.getIdentifierInfo(), IsPartition);
   if (Import.isInvalid())
     return nullptr;
 
@@ -2559,6 +2564,8 @@ bool Parser::ParseModuleName(SourceLocation UseLoc,
 }
 
 bool Parser::parseMisplacedModuleImport() {
+  CXXScopeSpec SS;
+
   while (true) {
     switch (Tok.getKind()) {
     case tok::annot_module_end:
@@ -2568,7 +2575,7 @@ bool Parser::parseMisplacedModuleImport() {
       if (MisplacedModuleBeginCount) {
         --MisplacedModuleBeginCount;
         Actions.ActOnAnnotModuleEnd(
-            Tok.getLocation(),
+            &SS, Tok.getLocation(), Tok.getIdentifierInfo(),
             reinterpret_cast<Module *>(Tok.getAnnotationValue()));
         ConsumeAnnotationToken();
         continue;
@@ -2589,7 +2596,7 @@ bool Parser::parseMisplacedModuleImport() {
       // Module import found where it should not be, for instance, inside a
       // namespace. Recover by importing the module.
       Actions.ActOnAnnotModuleInclude(
-          Tok.getLocation(),
+          &SS, Tok.getLocation(), Tok.getIdentifierInfo(),
           reinterpret_cast<Module *>(Tok.getAnnotationValue()));
       ConsumeAnnotationToken();
       // If there is another module import, process it.
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
index 65b60964d1192..ea94e08d9c552 100644
--- a/clang/lib/Sema/SemaLookup.cpp
+++ b/clang/lib/Sema/SemaLookup.cpp
@@ -1705,7 +1705,7 @@ hasAcceptableDefaultArgument(Sema &S, const ParmDecl *D,
       return true;
 
     if (!DefaultArg.isInherited() && Modules) {
-      auto *NonConstD = const_cast<ParmDecl*>(D);
+      auto *NonConstD = const_cast<ParmDecl *>(D);
       Modules->push_back(S.getOwningModule(NonConstD));
     }
 
@@ -2622,7 +2622,7 @@ bool Sema::LookupQualifiedName(LookupResult &R, 
DeclContext *LookupCtx,
         // possibility of declarations appearing more than once.
         llvm::SmallDenseMap<Result, bool, 32> AResults;
         for (; AResult; AResult = Next(AIt, AEnd))
-          AResults.insert({AResult, /*FoundInB*/false});
+          AResults.insert({AResult, /*FoundInB*/ false});
         unsigned Found = 0;
         for (; BResult; BResult = Next(BIt, BEnd)) {
           auto It = AResults.find(BResult);
@@ -3667,8 +3667,7 @@ CXXMethodDecl 
*Sema::LookupCopyingAssignment(CXXRecordDecl *Class,
 }
 
 CXXMethodDecl *Sema::LookupMovingAssignment(CXXRecordDecl *Class,
-                                            unsigned Quals,
-                                            bool RValueThis,
+                                            unsigned Quals, bool RValueThis,
                                             unsigned ThisQuals) {
   assert(!(ThisQuals & ~(Qualifiers::Const | Qualifiers::Volatile)) &&
          "non-const, non-volatile qualifiers for copy assignment this");
@@ -5711,10 +5710,10 @@ void Sema::diagnoseMissingImport(SourceLocation UseLoc, 
const NamedDecl *Decl,
     // declaration was previously reached.
     Diag(DeclLoc, diag::note_unreachable_entity) << (int)MIK;
   };
-
+  CXXScopeSpec SS;
   // Weed out duplicates from module list.
-  llvm::SmallVector<Module*, 8> UniqueModules;
-  llvm::SmallDenseSet<Module*, 8> UniqueModuleSet;
+  llvm::SmallVector<Module *, 8> UniqueModules;
+  llvm::SmallDenseSet<Module *, 8> UniqueModuleSet;
   for (auto *M : Modules) {
     if (M->isExplicitGlobalModule() || M->isPrivateModule())
       continue;
@@ -5742,7 +5741,8 @@ void Sema::diagnoseMissingImport(SourceLocation UseLoc, 
const NamedDecl *Decl,
     // Produce a note showing where the entity was declared.
     NotePrevious();
     if (Recover)
-      createImplicitModuleImportForErrorRecovery(UseLoc, Modules[0]);
+      createImplicitModuleImportForErrorRecovery(&SS, UseLoc, 
DeclarationName(),
+                                                 Modules[0]);
     return;
   }
 
@@ -5788,7 +5788,8 @@ void Sema::diagnoseMissingImport(SourceLocation UseLoc, 
const NamedDecl *Decl,
 
   // Try to recover by implicitly importing this module.
   if (Recover)
-    createImplicitModuleImportForErrorRecovery(UseLoc, Modules[0]);
+    createImplicitModuleImportForErrorRecovery(&SS, UseLoc, DeclarationName(),
+                                               Modules[0]);
 }
 
 void Sema::diagnoseTypo(const TypoCorrection &Correction,
diff --git a/clang/lib/Sema/SemaModule.cpp b/clang/lib/Sema/SemaModule.cpp
index caa61a99a6914..ca7ae8fdd4399 100644
--- a/clang/lib/Sema/SemaModule.cpp
+++ b/clang/lib/Sema/SemaModule.cpp
@@ -152,8 +152,7 @@ makeTransitiveImportsVisible(ASTContext &Ctx, 
VisibleModuleSet &VisibleModules,
 Sema::DeclGroupPtrTy
 Sema::ActOnGlobalModuleFragmentDecl(SourceLocation ModuleLoc) {
   // We start in the global module;
-  Module *GlobalModule =
-      PushGlobalModuleFragment(ModuleLoc);
+  Module *GlobalModule = PushGlobalModuleFragment(ModuleLoc);
 
   // All declarations created from now on are owned by the global module.
   auto *TU = Context.getTranslationUnitDecl();
@@ -246,9 +245,10 @@ static bool DiagReservedModuleName(Sema &S, const 
IdentifierInfo *II,
 }
 
 Sema::DeclGroupPtrTy
-Sema::ActOnModuleDecl(SourceLocation StartLoc, SourceLocation ModuleLoc,
-                      ModuleDeclKind MDK, ModuleIdPath Path,
-                      ModuleIdPath Partition, ModuleImportState &ImportState,
+Sema::ActOnModuleDecl(CXXScopeSpec *SS, SourceLocation StartLoc,
+                      SourceLocation ModuleLoc, ModuleDeclKind MDK,
+                      ModuleIdPath Path, ModuleIdPath Partition,
+                      ModuleImportState &ImportState, IdentifierInfo *Id,
                       bool SeenNoTrivialPPDirective) {
   assert(getLangOpts().CPlusPlusModules &&
          "should only have module decl in standard C++ modules");
@@ -470,14 +470,14 @@ Sema::ActOnModuleDecl(SourceLocation StartLoc, 
SourceLocation ModuleLoc,
   // and return the import decl to be added to the current TU.
   if (Interface) {
     HadImportedNamedModules = true;
-
     makeTransitiveImportsVisible(getASTContext(), VisibleModules, Interface,
                                  Mod, ModuleLoc,
                                  /*IsImportingPrimaryModuleInterface=*/true);
 
     // Make the import decl for the interface in the impl module.
-    ImportDecl *Import = ImportDecl::Create(Context, CurContext, ModuleLoc,
-                                            Interface, Path[0].getLoc());
+    ImportDecl *Import = ImportDecl::Create(
+        Context, CurContext, SS->getWithLocInContext(Context), ModuleLoc,
+        Interface, Id, Path[0].getLoc());
     CurContext->addDecl(Import);
 
     // Sequence initialization of the imported module before that of the 
current
@@ -557,10 +557,10 @@ Sema::ActOnPrivateModuleFragmentDecl(SourceLocation 
ModuleLoc,
   return nullptr;
 }
 
-DeclResult Sema::ActOnModuleImport(SourceLocation StartLoc,
+DeclResult Sema::ActOnModuleImport(CXXScopeSpec *SS, SourceLocation StartLoc,
                                    SourceLocation ExportLoc,
                                    SourceLocation ImportLoc, ModuleIdPath Path,
-                                   bool IsPartition) {
+                                   IdentifierInfo *Id, bool IsPartition) {
   assert((!IsPartition || getLangOpts().CPlusPlusModules) &&
          "partition seen in non-C++20 code?");
 
@@ -614,7 +614,7 @@ DeclResult Sema::ActOnModuleImport(SourceLocation StartLoc,
     return true;
   }
 
-  return ActOnModuleImport(StartLoc, ExportLoc, ImportLoc, Mod, Path);
+  return ActOnModuleImport(SS, StartLoc, ExportLoc, ImportLoc, Mod, Id, Path);
 }
 
 /// Determine whether \p D is lexically within an export-declaration.
@@ -625,10 +625,10 @@ static const ExportDecl *getEnclosingExportDecl(const 
Decl *D) {
   return nullptr;
 }
 
-DeclResult Sema::ActOnModuleImport(SourceLocation StartLoc,
+DeclResult Sema::ActOnModuleImport(CXXScopeSpec *SS, SourceLocation StartLoc,
                                    SourceLocation ExportLoc,
                                    SourceLocation ImportLoc, Module *Mod,
-                                   ModuleIdPath Path) {
+                                   IdentifierInfo *Id, ModuleIdPath Path) {
   if (Mod->isHeaderUnit())
     Diag(ImportLoc, diag::warn_experimental_header_unit);
 
@@ -683,8 +683,9 @@ DeclResult Sema::ActOnModuleImport(SourceLocation StartLoc,
     }
   }
 
-  ImportDecl *Import = ImportDecl::Create(Context, CurContext, StartLoc,
-                                          Mod, IdentifierLocs);
+  ImportDecl *Import =
+      ImportDecl::Create(Context, CurContext, SS->getWithLocInContext(Context),
+                         StartLoc, Mod, Id, IdentifierLocs);
   CurContext->addDecl(Import);
 
   // Sequence initialization of the imported module before that of the current
@@ -718,12 +719,15 @@ DeclResult Sema::ActOnModuleImport(SourceLocation 
StartLoc,
   return Import;
 }
 
-void Sema::ActOnAnnotModuleInclude(SourceLocation DirectiveLoc, Module *Mod) {
+void Sema::ActOnAnnotModuleInclude(CXXScopeSpec *SS,
+                                   SourceLocation DirectiveLoc,
+                                   IdentifierInfo *Id, Module *Mod) {
   checkModuleImportContext(*this, Mod, DirectiveLoc, CurContext, true);
-  BuildModuleInclude(DirectiveLoc, Mod);
+  BuildModuleInclude(SS, DirectiveLoc, Id, Mod);
 }
 
-void Sema::BuildModuleInclude(SourceLocation DirectiveLoc, Module *Mod) {
+void Sema::BuildModuleInclude(CXXScopeSpec *SS, SourceLocation DirectiveLoc,
+                              IdentifierInfo *Id, Module *Mod) {
   // Determine whether we're in the #include buffer for a module. The #includes
   // in that buffer do not qualify as module imports; they're just an
   // implementation detail of us building the module.
@@ -737,9 +741,9 @@ void Sema::BuildModuleInclude(SourceLocation DirectiveLoc, 
Module *Mod) {
   // #include in the main file, synthesize an ImportDecl.
   if (getLangOpts().Modules && !IsInModuleIncludes) {
     TranslationUnitDecl *TU = getASTContext().getTranslationUnitDecl();
-    ImportDecl *ImportD = ImportDecl::CreateImplicit(getASTContext(), TU,
-                                                     DirectiveLoc, Mod,
-                                                     DirectiveLoc);
+    ImportDecl *ImportD = ImportDecl::CreateImplicit(
+        getASTContext(), TU, DirectiveLoc, Mod,
+        SS->getWithLocInContext(getASTContext()), Id, DirectiveLoc);
     if (!ModuleScopes.empty())
       Context.addModuleInitializer(ModuleScopes.back().Module, ImportD);
     TU->addDecl(ImportD);
@@ -786,7 +790,8 @@ void Sema::ActOnAnnotModuleBegin(SourceLocation 
DirectiveLoc, Module *Mod) {
   }
 }
 
-void Sema::ActOnAnnotModuleEnd(SourceLocation EomLoc, Module *Mod) {
+void Sema::ActOnAnnotModuleEnd(CXXScopeSpec *SS, SourceLocation EomLoc,
+                               IdentifierInfo *Id, Module *Mod) {
   if (getLangOpts().ModulesLocalVisibility) {
     VisibleModules = std::move(ModuleScopes.back().OuterVisibleModules);
     // Leaving a module hides namespace names, so our visible namespace cache
@@ -811,7 +816,7 @@ void Sema::ActOnAnnotModuleEnd(SourceLocation EomLoc, 
Module *Mod) {
     // We reached an EOM pragma. Use the pragma location.
     DirectiveLoc = EomLoc;
   }
-  BuildModuleInclude(DirectiveLoc, Mod);
+  BuildModuleInclude(SS, DirectiveLoc, Id, Mod);
 
   // Any further declarations are in whatever module we returned to.
   if (getLangOpts().trackLocalOwningModule()) {
@@ -826,7 +831,9 @@ void Sema::ActOnAnnotModuleEnd(SourceLocation EomLoc, 
Module *Mod) {
   }
 }
 
-void Sema::createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
+void Sema::createImplicitModuleImportForErrorRecovery(CXXScopeSpec *SS,
+                                                      SourceLocation Loc,
+                                                      DeclarationName Id,
                                                       Module *Mod) {
   // Bail if we're not allowed to implicitly import a module here.
   if (isSFINAEContext() || !getLangOpts().ModulesErrorRecovery ||
@@ -835,8 +842,9 @@ void 
Sema::createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
 
   // Create the implicit import declaration.
   TranslationUnitDecl *TU = getASTContext().getTranslationUnitDecl();
-  ImportDecl *ImportD = ImportDecl::CreateImplicit(getASTContext(), TU,
-                                                   Loc, Mod, Loc);
+  ImportDecl *ImportD = ImportDecl::CreateImplicit(
+      getASTContext(), TU, Loc, Mod, SS->getWithLocInContext(getASTContext()),
+      Id, Loc);
   TU->addDecl(ImportD);
   Consumer.HandleImplicitImportDecl(ImportD);
 
@@ -845,9 +853,12 @@ void 
Sema::createImplicitModuleImportForErrorRecovery(SourceLocation Loc,
   VisibleModules.setVisible(Mod, Loc);
 }
 
-Decl *Sema::ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc,
+Decl *Sema::ActOnStartExportDecl(Scope *S, CXXScopeSpec *SS,
+                                 SourceLocation ExportLoc, IdentifierInfo *Id,
                                  SourceLocation LBraceLoc) {
-  ExportDecl *D = ExportDecl::Create(Context, CurContext, ExportLoc);
+  ExportDecl *D =
+      ExportDecl::Create(Context, CurContext, ExportLoc,
+                         SS->getWithLocInContext(getASTContext()), Id);
 
   // Set this temporarily so we know the export-declaration was braced.
   D->setRBraceLoc(LBraceLoc);
@@ -867,12 +878,13 @@ Decl *Sema::ActOnStartExportDecl(Scope *S, SourceLocation 
ExportLoc,
     } else if (currentModuleIsImplementation()) {
       Diag(ExportLoc, diag::err_export_not_in_module_interface) << 1;
       Diag(ModuleScopes.back().BeginLoc,
-          diag::note_not_module_interface_add_export)
-          << FixItHint::CreateInsertion(ModuleScopes.back().BeginLoc, "export 
");
+           diag::note_not_module_interface_add_export)
+          << FixItHint::CreateInsertion(ModuleScopes.back().BeginLoc,
+                                        "export ");
       D->setInvalidDecl();
       return D;
     } else if (ModuleScopes.back().Module->Kind ==
-              Module::PrivateModuleFragment) {
+               Module::PrivateModuleFragment) {
       Diag(ExportLoc, diag::err_export_in_private_module_fragment);
       Diag(ModuleScopes.back().BeginLoc, diag::note_private_module_fragment);
       D->setInvalidDecl();

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to