[modules] Properly attribute macros to modules if they're in a file textually included into a file in the module.

llvm-svn: 235661
diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h
index 94c4e24..635428e 100644
--- a/clang/include/clang/Lex/Preprocessor.h
+++ b/clang/include/clang/Lex/Preprocessor.h
@@ -1669,9 +1669,14 @@
   void HandleMicrosoftImportDirective(Token &Tok);
 
   // Module inclusion testing.
-  /// \brief Find the module for the source or header file that \p FilenameLoc
-  /// points to.
-  Module *getModuleForLocation(SourceLocation FilenameLoc);
+  /// \brief Find the module that owns the source or header file that
+  /// \p Loc points to. If the location is in a file that was included
+  /// into a module, or is outside any module, returns nullptr.
+  Module *getModuleForLocation(SourceLocation Loc);
+
+  /// \brief Find the module that contains the specified location, either
+  /// directly or indirectly.
+  Module *getModuleContainingLocation(SourceLocation Loc);
 
   // Macro handling.
   void HandleDefineDirective(Token &Tok, bool ImmediatelyAfterTopLevelIfndef);
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index 4f3efa5..9084915 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/lib/Lex/PPDirectives.cpp
@@ -577,16 +577,16 @@
   }
 }
 
-Module *Preprocessor::getModuleForLocation(SourceLocation FilenameLoc) {
+Module *Preprocessor::getModuleForLocation(SourceLocation Loc) {
   ModuleMap &ModMap = HeaderInfo.getModuleMap();
-  if (SourceMgr.isInMainFile(FilenameLoc)) {
+  if (SourceMgr.isInMainFile(Loc)) {
     if (Module *CurMod = getCurrentModule())
       return CurMod;                               // Compiling a module.
     return HeaderInfo.getModuleMap().SourceModule; // Compiling a source.
   }
   // Try to determine the module of the include directive.
   // FIXME: Look into directly passing the FileEntry from LookupFile instead.
-  FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(FilenameLoc));
+  FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
   if (const FileEntry *EntryOfIncl = SourceMgr.getFileEntryForID(IDOfIncl)) {
     // The include comes from a file.
     return ModMap.findModuleForHeader(EntryOfIncl).getModule();
@@ -597,6 +597,11 @@
   }
 }
 
+Module *Preprocessor::getModuleContainingLocation(SourceLocation Loc) {
+  return HeaderInfo.getModuleMap().inferModuleFromLocation(
+      FullSourceLoc(Loc, SourceMgr));
+}
+
 const FileEntry *Preprocessor::LookupFile(
     SourceLocation FilenameLoc,
     StringRef Filename,
diff --git a/clang/lib/Lex/PPLexerChange.cpp b/clang/lib/Lex/PPLexerChange.cpp
index 33f5ff0..8a74a95 100644
--- a/clang/lib/Lex/PPLexerChange.cpp
+++ b/clang/lib/Lex/PPLexerChange.cpp
@@ -633,7 +633,7 @@
     for (auto *MD = Macro.second.getLatest(); MD != State.getLatest();
          MD = MD->getPrevious()) {
       // Skip macros defined in other submodules we #included along the way.
-      Module *Mod = getModuleForLocation(MD->getLocation());
+      Module *Mod = getModuleContainingLocation(MD->getLocation());
       if (Mod != Info.M)
         continue;
 
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp
index 54f72f6..174718f 100644
--- a/clang/lib/Lex/PPMacroExpansion.cpp
+++ b/clang/lib/Lex/PPMacroExpansion.cpp
@@ -60,12 +60,12 @@
 
   // Accumulate any overridden imported macros.
   if (!MD->isImported() && getCurrentModule()) {
-    Module *OwningMod = getModuleForLocation(MD->getLocation());
+    Module *OwningMod = getModuleContainingLocation(MD->getLocation());
     if (!OwningMod)
       return;
 
     for (auto *PrevMD = OldMD; PrevMD; PrevMD = PrevMD->getPrevious()) {
-      Module *DirectiveMod = getModuleForLocation(PrevMD->getLocation());
+      Module *DirectiveMod = getModuleContainingLocation(PrevMD->getLocation());
       if (ModuleMacro *PrevMM = PrevMD->getOwningModuleMacro())
         StoredMD.addOverriddenMacro(*this, PrevMM);
       else if (ModuleMacro *PrevMM = getModuleMacro(DirectiveMod, II))
diff --git a/clang/test/Modules/Inputs/macros-indirect.h b/clang/test/Modules/Inputs/macros-indirect.h
new file mode 100644
index 0000000..c90300e
--- /dev/null
+++ b/clang/test/Modules/Inputs/macros-indirect.h
@@ -0,0 +1 @@
+#define INDIRECTLY_IN_MACROS 1
diff --git a/clang/test/Modules/Inputs/macros.h b/clang/test/Modules/Inputs/macros.h
index 27f43c0..a0ae7a3 100644
--- a/clang/test/Modules/Inputs/macros.h
+++ b/clang/test/Modules/Inputs/macros.h
@@ -17,3 +17,4 @@
 extern int __MODULE__;
 #endif
 
+#include "macros-indirect.h"
diff --git a/clang/test/Modules/macros.c b/clang/test/Modules/macros.c
index 92ea88a4..3ca5300 100644
--- a/clang/test/Modules/macros.c
+++ b/clang/test/Modules/macros.c
@@ -28,6 +28,10 @@
 #  error MODULE macro should not be visible
 #endif
 
+#ifndef INDIRECTLY_IN_MACROS
+#  error INDIRECTLY_IN_MACROS should be visible
+#endif
+
 // CHECK-PREPROCESSED: double d
 double d;
 DOUBLE *dp = &d;