]> granicus.if.org Git - clang/commitdiff
When we make a previously-deserialized module definition visible,
authorDouglas Gregor <dgregor@apple.com>
Tue, 20 Dec 2011 22:06:13 +0000 (22:06 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 20 Dec 2011 22:06:13 +0000 (22:06 +0000)
notify the AST deserialization listener so that the AST writer knows
that it can write the macro definition.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146994 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Serialization/ASTDeserializationListener.h
include/clang/Serialization/ASTWriter.h
lib/Serialization/ASTReader.cpp
lib/Serialization/ASTWriter.cpp
test/Modules/Inputs/redecl-merge-right.h
test/Modules/Inputs/redecl-merge-top-explicit.h

index 731148ecf8ffae840c9fe418b9f5e3103322b33a..ab0d313a5c84df13d7e76ff1dda200e91cfd7768 100644 (file)
@@ -48,6 +48,9 @@ public:
   /// \brief A macro definition was read from the AST file.
   virtual void MacroDefinitionRead(serialization::PreprocessedEntityID, 
                                    MacroDefinition *MD) { }
+  /// \brief A macro definition that had previously been deserialized 
+  /// (and removed via IdentifierRead) has now been made visible.
+  virtual void MacroVisible(IdentifierInfo *II) { }
   /// \brief A module definition was read from the AST file.
   virtual void ModuleRead(serialization::SubmoduleID ID, Module *Mod) { }
 };
index fd581bc4521ff6f382de696a6630998be0a99991..8791d83d93698089cd0f9c28e49c89baed3b3c39 100644 (file)
@@ -671,6 +671,7 @@ public:
   void SelectorRead(serialization::SelectorID ID, Selector Sel);
   void MacroDefinitionRead(serialization::PreprocessedEntityID ID,
                            MacroDefinition *MD);
+  void MacroVisible(IdentifierInfo *II);
   void ModuleRead(serialization::SubmoduleID ID, Module *Mod);
                     
   // ASTMutationListener implementation.
index 5971011fce662f592c7cf5d26bab4c5b48e37b03..cb2759bd03acb2d67023101a6125ad20d77322e5 100644 (file)
@@ -2487,8 +2487,14 @@ void ASTReader::makeNamesVisible(const HiddenNames &Names) {
   for (unsigned I = 0, N = Names.size(); I != N; ++I) {
     if (Decl *D = Names[I].dyn_cast<Decl *>())
       D->ModulePrivate = false;
-    else
-      Names[I].get<IdentifierInfo *>()->setHasMacroDefinition(true);
+    else {
+      IdentifierInfo *II = Names[I].get<IdentifierInfo *>();
+      if (!II->hasMacroDefinition()) {
+        II->setHasMacroDefinition(true);
+        if (DeserializationListener)
+          DeserializationListener->MacroVisible(II);
+      }
+    }
   }
 }
 
index 6883dbe329421ee79fe52b0f217d7962c867c85c..97c31b07a37b72361dd46ab6b9cf70c6c0a8f84a 100644 (file)
@@ -1660,8 +1660,9 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) {
   for (Preprocessor::macro_iterator I = PP.macro_begin(Chain == 0), 
                                     E = PP.macro_end(Chain == 0);
        I != E; ++I) {
+    const IdentifierInfo *Name = I->first;
     if (!IsModule || I->second->isPublic()) {
-      MacroDefinitionsSeen.insert(I->first);
+      MacroDefinitionsSeen.insert(Name);
       MacrosToEmit.push_back(std::make_pair(I->first, I->second));
     }
   }
@@ -4262,6 +4263,10 @@ void ASTWriter::MacroDefinitionRead(serialization::PreprocessedEntityID ID,
   MacroDefinitions[MD] = ID;
 }
 
+void ASTWriter::MacroVisible(IdentifierInfo *II) {
+  DeserializedMacroNames.push_back(II);
+}
+
 void ASTWriter::ModuleRead(serialization::SubmoduleID ID, Module *Mod) {
   assert(SubmoduleIDs.find(Mod) == SubmoduleIDs.end());
   SubmoduleIDs[Mod] = ID;
index f0bfd35746f2611aa23e8d566e646fd26600336b..26eed69b91b2880c000b14eb16f8238800c32a0f 100644 (file)
@@ -21,3 +21,7 @@ public:
   void push_back(const T&);
 };
 #endif
+
+int ONE;
+__import_module__ redecl_merge_top.Explicit;
+const int one = ONE;
index c8f51589f316f66061bfce141f1b8d7da494d53b..54aab33e6ca4e619d012bc1509cd4c2c5bd1f38b 100644 (file)
@@ -3,3 +3,5 @@
 int *explicit_func(void);
 
 struct explicit_struct { int member; };
+
+#define ONE 1