summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2016-01-08 22:36:45 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2016-01-08 22:36:45 +0000
commitf7aeda1f07dd46ea74efb2bc1d9f3aa33536991d (patch)
tree601db3e5f7a5b9854501b8e3deb446d3c7bafb64
parent9d49638f4466f0000fccd2570cde04e11e560fcb (diff)
downloadbcm5719-llvm-f7aeda1f07dd46ea74efb2bc1d9f3aa33536991d.tar.gz
bcm5719-llvm-f7aeda1f07dd46ea74efb2bc1d9f3aa33536991d.zip
[modules] Make sure we always include the contents of private headers when
building a module. Prior to this change, the private header's content would only be included if the header were included by another header in the same module. If not (if the private header is only used by the .cc files of the module, or is included from outside the module via -Wno-private-header), a #include of that file would be silently ignored. llvm-svn: 257222
-rw-r--r--clang/lib/Frontend/FrontendActions.cpp20
-rw-r--r--clang/test/Modules/Inputs/dummy.h4
-rw-r--r--clang/test/Modules/modular_maps.cpp2
-rw-r--r--clang/test/Modules/separate_map_tree.cpp2
4 files changed, 16 insertions, 12 deletions
diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp
index d6c88d20fc2..407ccea2e7d 100644
--- a/clang/lib/Frontend/FrontendActions.cpp
+++ b/clang/lib/Frontend/FrontendActions.cpp
@@ -187,15 +187,17 @@ collectModuleHeaderIncludes(const LangOptions &LangOpts, FileManager &FileMgr,
return std::error_code();
// Add includes for each of these headers.
- for (Module::Header &H : Module->Headers[Module::HK_Normal]) {
- Module->addTopHeader(H.Entry);
- // Use the path as specified in the module map file. We'll look for this
- // file relative to the module build directory (the directory containing
- // the module map file) so this will find the same file that we found
- // while parsing the module map.
- if (std::error_code Err = addHeaderInclude(H.NameAsWritten, Includes,
- LangOpts, Module->IsExternC))
- return Err;
+ for (auto HK : {Module::HK_Normal, Module::HK_Private}) {
+ for (Module::Header &H : Module->Headers[HK]) {
+ Module->addTopHeader(H.Entry);
+ // Use the path as specified in the module map file. We'll look for this
+ // file relative to the module build directory (the directory containing
+ // the module map file) so this will find the same file that we found
+ // while parsing the module map.
+ if (std::error_code Err = addHeaderInclude(H.NameAsWritten, Includes,
+ LangOpts, Module->IsExternC))
+ return Err;
+ }
}
// Note that Module->PrivateHeaders will not be a TopHeader.
diff --git a/clang/test/Modules/Inputs/dummy.h b/clang/test/Modules/Inputs/dummy.h
index 6e1ac74e44f..cad83154dc2 100644
--- a/clang/test/Modules/Inputs/dummy.h
+++ b/clang/test/Modules/Inputs/dummy.h
@@ -1,3 +1,5 @@
// This module only exists to make local decl IDs and global decl IDs different.
-
+#ifndef DUMMY_H
+#define DUMMY_H
struct Dummy {} extern *dummy1, *dummy2, *dummy3;
+#endif
diff --git a/clang/test/Modules/modular_maps.cpp b/clang/test/Modules/modular_maps.cpp
index 3b6afc7552d..fc44131d458 100644
--- a/clang/test/Modules/modular_maps.cpp
+++ b/clang/test/Modules/modular_maps.cpp
@@ -16,4 +16,4 @@
#include "b.h" // expected-error {{private header}}
@import C;
const int v = a + c + x;
-const int val = a + b + c + x; // expected-error {{undeclared identifier}}
+const int val = a + b + c + x;
diff --git a/clang/test/Modules/separate_map_tree.cpp b/clang/test/Modules/separate_map_tree.cpp
index 5a1fff4efc7..a5cb9888a60 100644
--- a/clang/test/Modules/separate_map_tree.cpp
+++ b/clang/test/Modules/separate_map_tree.cpp
@@ -5,4 +5,4 @@
#include "public-in-b.h" // expected-error {{private header}}
#include "public-in-c.h"
#include "private-in-c.h" // expected-error {{private header}}
-const int val = common + b + c + c_; // expected-error {{undeclared identifier}}
+const int val = common + b + c + c_;
OpenPOWER on IntegriCloud