From 2d4a11fba6a55fa0fc2b552ec082a4ea74dfbddf Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Mon, 18 May 2015 20:02:41 +0000 Subject: [PATCH] [modules] When a file is listed as a non-textual header in a module map, don't enter it more than once, even if it doesn't have #include guards -- we already know that it is intended to have the same effect every time it's included, and it's already had that effect. This particularly helps with local submodule visibility builds, where the include guard macro may not be visible in the includer, but will become visible the moment we enter the included file. llvm-svn: 237609 --- clang/lib/Lex/PPDirectives.cpp | 9 ++++----- clang/test/Modules/malformed.cpp | 6 +++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index ec06e790f018..aaed6b92d48b 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -1737,13 +1737,12 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc, std::max(HeaderInfo.getFileDirFlavor(File), SourceMgr.getFileCharacteristic(FilenameTok.getLocation())); - // FIXME: If we have a suggested module, and we've already visited this file, - // don't bother entering it again. We know it has no further effect. - // Ask HeaderInfo if we should enter this #include file. If not, #including - // this file will have no effect. + // this file will have no effect. We treat any textual inclusion of a modular + // header as a #import here. if (ShouldEnter && - !HeaderInfo.ShouldEnterIncludeFile(*this, File, isImport)) { + !HeaderInfo.ShouldEnterIncludeFile( + *this, File, isImport || SuggestedModule.getModule())) { ShouldEnter = false; if (Callbacks) Callbacks->FileSkipped(*File, FilenameTok, FileCharacter); diff --git a/clang/test/Modules/malformed.cpp b/clang/test/Modules/malformed.cpp index 2d07c4cd0da7..6d49850cceec 100644 --- a/clang/test/Modules/malformed.cpp +++ b/clang/test/Modules/malformed.cpp @@ -23,9 +23,9 @@ // CHECK-B: {{^}}Inputs/malformed/b1.h:1:{{.*}} note: to match this '{' // CHECK-B: {{^}}Inputs/malformed/b1.h:3:{{.*}} error: extraneous closing brace ('}') // -// CHECK-B: While building module 'malformed_b' -// CHECK-B: {{^}}Inputs/malformed/b2.h:1:{{.*}} error: redefinition of 'g' -// CHECK-B: {{^}}Inputs/malformed/b2.h:1:{{.*}} note: previous definition is here +// We don't see another definition of 'g' because we don't re-enter b2.h +// (even though it has no include guards). +// CHECK-B-NOT: redefinition of 'g' void test() { f(); } // Test that we use relative paths to name files within an imported module.