diff options
author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2017-01-12 19:15:33 +0000 |
---|---|---|
committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2017-01-12 19:15:33 +0000 |
commit | ddf8ad1ce5d02a3af5e9a9b3338ba72ec33516d0 (patch) | |
tree | fb32f099f405360300151b1d7645d375a68e6145 | |
parent | ae27323dfa5ac5546842b2531129fa1234302ce5 (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
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 |