summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>2017-01-12 19:15:33 +0000
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>2017-01-12 19:15:33 +0000
commitddf8ad1ce5d02a3af5e9a9b3338ba72ec33516d0 (patch)
treefb32f099f405360300151b1d7645d375a68e6145
parentae27323dfa5ac5546842b2531129fa1234302ce5 (diff)
[Modules] Fix misleading warning about missing textual header in umbrella header
When a textual header is present inside a umbrella dir but not in the header, we get the misleading warning: warning: umbrella header for module 'FooFramework' does not include header 'Baz_Private.h' The module map in question: framework module FooFramework { umbrella header "FooUmbrella.h" export * module * { export * } module Private { textual header "Baz_Private.h" } } Fix this by taking textual headers into account. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@291794 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Lex/ModuleMap.cpp14
-rw-r--r--test/Modules/Inputs/FooFramework.framework/Modules/module.modulemap12
-rw-r--r--test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Bar.h2
-rw-r--r--test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Baz_Private.h3
-rw-r--r--test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Foo.h10
-rw-r--r--test/Modules/Inputs/FooFramework.framework/PrivateHeaders/FooUmbrella.h3
-rw-r--r--test/Modules/textual-hdr-in-umbrella-hdr.m10
7 files changed, 52 insertions, 2 deletions
diff --git a/lib/Lex/ModuleMap.cpp b/lib/Lex/ModuleMap.cpp
index db834ede02..1488f624da 100644
--- a/lib/Lex/ModuleMap.cpp
+++ b/lib/Lex/ModuleMap.cpp
@@ -446,9 +446,19 @@ ModuleMap::isHeaderUnavailableInModule(const FileEntry *Header,
I = Known->second.begin(),
E = Known->second.end();
I != E; ++I) {
- if (I->isAvailable() && (!RequestingModule ||
- I->getModule()->isSubModuleOf(RequestingModule)))
+
+ if (I->isAvailable() &&
+ (!RequestingModule ||
+ I->getModule()->isSubModuleOf(RequestingModule))) {
+ // When no requesting module is available, the caller is looking if a
+ // header is part a module by only looking into the module map. This is
+ // done by warn_uncovered_module_header checks; don't consider textual
+ // headers part of it in this mode, otherwise we get misleading warnings
+ // that a umbrella header is not including a textual header.
+ if (!RequestingModule && I->getRole() == ModuleMap::TextualHeader)
+ continue;
return false;
+ }
}
return true;
}
diff --git a/test/Modules/Inputs/FooFramework.framework/Modules/module.modulemap b/test/Modules/Inputs/FooFramework.framework/Modules/module.modulemap
new file mode 100644
index 0000000000..62e56364ab
--- /dev/null
+++ b/test/Modules/Inputs/FooFramework.framework/Modules/module.modulemap
@@ -0,0 +1,12 @@
+framework module FooFramework {
+ umbrella header "FooUmbrella.h"
+
+ export *
+ module * {
+ export *
+ }
+
+ explicit module Private {
+ textual header "Baz_Private.h"
+ }
+}
diff --git a/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Bar.h b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Bar.h
new file mode 100644
index 0000000000..d16b395055
--- /dev/null
+++ b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Bar.h
@@ -0,0 +1,2 @@
+@interface Bar
+@end
diff --git a/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Baz_Private.h b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Baz_Private.h
new file mode 100644
index 0000000000..3ea082b874
--- /dev/null
+++ b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Baz_Private.h
@@ -0,0 +1,3 @@
+#ifndef Baz_h
+#define Baz_h
+#endif /* Baz_h */
diff --git a/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Foo.h b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Foo.h
new file mode 100644
index 0000000000..26b96988d5
--- /dev/null
+++ b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/Foo.h
@@ -0,0 +1,10 @@
+__attribute__((objc_root_class))
+@interface NSObject
++ (instancetype) alloc;
+- (instancetype) init;
+- (instancetype)retain;
+- (void)release;
+@end
+
+@interface Foo : NSObject
+@end
diff --git a/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/FooUmbrella.h b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/FooUmbrella.h
new file mode 100644
index 0000000000..c752fb299e
--- /dev/null
+++ b/test/Modules/Inputs/FooFramework.framework/PrivateHeaders/FooUmbrella.h
@@ -0,0 +1,3 @@
+#import <FooFramework/Foo.h>
+#import <FooFramework/Bar.h>
+
diff --git a/test/Modules/textual-hdr-in-umbrella-hdr.m b/test/Modules/textual-hdr-in-umbrella-hdr.m
new file mode 100644
index 0000000000..f92cdb91b2
--- /dev/null
+++ b/test/Modules/textual-hdr-in-umbrella-hdr.m
@@ -0,0 +1,10 @@
+// RUN: rm -rf %t.cache
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t.cache \
+// RUN: %s -fsyntax-only -F %S/Inputs -Wincomplete-umbrella -verify
+
+// expected-no-diagnostics
+
+#import <FooFramework/Foo.h>
+
+@implementation Foo
+@end