diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Serialization/ASTWriter.cpp | 47 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/MacroFabs1.h | 6 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/module.map | 4 | ||||
-rw-r--r-- | clang/test/Modules/Inputs/pch-import-module-with-macro.pch | 3 | ||||
-rw-r--r-- | clang/test/Modules/pch-module-macro.m | 9 |
5 files changed, 45 insertions, 24 deletions
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 7540bc03d15..0c9264f4032 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -2187,30 +2187,29 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) { // Write out any exported module macros. bool EmittedModuleMacros = false; - if (IsModule) { - auto Leafs = PP.getLeafModuleMacros(Name); - SmallVector<ModuleMacro*, 8> Worklist(Leafs.begin(), Leafs.end()); - llvm::DenseMap<ModuleMacro*, unsigned> Visits; - while (!Worklist.empty()) { - auto *Macro = Worklist.pop_back_val(); - - // Emit a record indicating this submodule exports this macro. - ModuleMacroRecord.push_back( - getSubmoduleID(Macro->getOwningModule())); - ModuleMacroRecord.push_back(getMacroRef(Macro->getMacroInfo(), Name)); - for (auto *M : Macro->overrides()) - ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule())); - - Stream.EmitRecord(PP_MODULE_MACRO, ModuleMacroRecord); - ModuleMacroRecord.clear(); - - // Enqueue overridden macros once we've visited all their ancestors. - for (auto *M : Macro->overrides()) - if (++Visits[M] == M->getNumOverridingMacros()) - Worklist.push_back(M); - - EmittedModuleMacros = true; - } + // We write out exported module macros for PCH as well. + auto Leafs = PP.getLeafModuleMacros(Name); + SmallVector<ModuleMacro*, 8> Worklist(Leafs.begin(), Leafs.end()); + llvm::DenseMap<ModuleMacro*, unsigned> Visits; + while (!Worklist.empty()) { + auto *Macro = Worklist.pop_back_val(); + + // Emit a record indicating this submodule exports this macro. + ModuleMacroRecord.push_back( + getSubmoduleID(Macro->getOwningModule())); + ModuleMacroRecord.push_back(getMacroRef(Macro->getMacroInfo(), Name)); + for (auto *M : Macro->overrides()) + ModuleMacroRecord.push_back(getSubmoduleID(M->getOwningModule())); + + Stream.EmitRecord(PP_MODULE_MACRO, ModuleMacroRecord); + ModuleMacroRecord.clear(); + + // Enqueue overridden macros once we've visited all their ancestors. + for (auto *M : Macro->overrides()) + if (++Visits[M] == M->getNumOverridingMacros()) + Worklist.push_back(M); + + EmittedModuleMacros = true; } if (Record.empty() && !EmittedModuleMacros) diff --git a/clang/test/Modules/Inputs/MacroFabs1.h b/clang/test/Modules/Inputs/MacroFabs1.h new file mode 100644 index 00000000000..a78c5539f4a --- /dev/null +++ b/clang/test/Modules/Inputs/MacroFabs1.h @@ -0,0 +1,6 @@ + +#undef fabs +#define fabs(x) (x) + +#undef my_fabs +#define my_fabs(x) (x) diff --git a/clang/test/Modules/Inputs/module.map b/clang/test/Modules/Inputs/module.map index 4db1cca925c..6846690c849 100644 --- a/clang/test/Modules/Inputs/module.map +++ b/clang/test/Modules/Inputs/module.map @@ -414,3 +414,7 @@ module MethodPoolString2 { } module Empty {} + +module MacroFabs1 { + header "MacroFabs1.h" +} diff --git a/clang/test/Modules/Inputs/pch-import-module-with-macro.pch b/clang/test/Modules/Inputs/pch-import-module-with-macro.pch new file mode 100644 index 00000000000..c06d7728b62 --- /dev/null +++ b/clang/test/Modules/Inputs/pch-import-module-with-macro.pch @@ -0,0 +1,3 @@ + +@import MacroFabs1; + diff --git a/clang/test/Modules/pch-module-macro.m b/clang/test/Modules/pch-module-macro.m new file mode 100644 index 00000000000..cc9f6873745 --- /dev/null +++ b/clang/test/Modules/pch-module-macro.m @@ -0,0 +1,9 @@ +// RUN: rm -rf %t +// RUN: %clang_cc1 -emit-pch -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -o %t.pch -I %S/Inputs -x objective-c-header %S/Inputs/pch-import-module-with-macro.pch +// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -fsyntax-only -I %S/Inputs -include-pch %t.pch %s -verify +// expected-no-diagnostics + +int test(int x) { + return my_fabs(x) + fabs(x); +} + |