llvm-project/clang
Dmitri Gribenko dc360d5739 Clang modules: collect exports recursively
This change makes Module::buildVisibleModulesCache() collect exported modules
recursively.

While computing a set of exports, getExportedModules() iterates over the set of
imported modules and filters it.  But it does not consider the set of exports
of those modules -- it is the responsibility of the caller to do this.

Here is a certain instance of this issue.  Module::isModuleVisible says that
CoreFoundation.CFArray submodule is not visible from Cocoa.  Why?

- Cocoa imports Foundation.
- Foundation has an export restriction: "export *".
- Foundation imports CoreFoundation.  (Just the top-level module.)
- CoreFoundation exports CoreFoundation.CFArray.

To decide which modules are visible from Cocoa, we collect all exported modules
from immediate imports in Cocoa:

> visibleModulesFro(Cocoa) = exported(Foundation) + exported(CoreData) + exported(AppKit)

To find out which modules are exported, we filter imports according to
restrictions:

> exported(Foundation) = filterByModuleMapRestrictions(imports(Foundation))

Because Foundation imports CoreFoundation (not CoreFoundation.CFArray), the
CFArray submodule is considered not exported from Foundation, and is not
visible from Cocoa (according to Module::isModuleVisible).

llvm-svn: 193815
2013-10-31 22:24:10 +00:00
..
INPUTS
bindings [libclang/python] Add __contains__ to SourceRange class. 2013-10-31 00:03:33 +00:00
docs ARM: Add -m[no-]crc to dis/enable CRC subtargetfeature from clang 2013-10-29 09:47:51 +00:00
examples Add irreader to the component list, because ParseIR is called. 2013-10-19 08:33:11 +00:00
include Clang modules: collect exports recursively 2013-10-31 22:24:10 +00:00
lib Clang modules: collect exports recursively 2013-10-31 22:24:10 +00:00
runtime [libsanitizer] configure+make: install include/sanitizer into Clang 2013-10-28 08:21:35 +00:00
test Fix a C struct diagnostic regression introduced by r187504 (PR17762). 2013-10-31 20:32:56 +00:00
tools Store a TypeArgument on an attribute as a TypeSourceInfo*, rather than as a 2013-10-31 21:23:20 +00:00
unittests clang-format: Fix indenting corner case with comment and else. 2013-10-30 14:04:10 +00:00
utils Store a TypeArgument on an attribute as a TypeSourceInfo*, rather than as a 2013-10-31 21:23:20 +00:00
www Implement C++1y sized deallocation (n3778). This is not enabled by -std=c++1y; 2013-09-29 04:40:38 +00:00
.arcconfig
.clang-format Switch the default mode for clang-format to '-file'. Make 'LLVM' the 2013-09-02 07:42:02 +00:00
.gitignore
CMakeLists.txt Revert commits r190613, r190560 and r190557. 2013-10-01 17:31:40 +00:00
CODE_OWNERS.TXT Revert r185557 as it was a bit (a lot) premature. 2013-07-03 20:37:50 +00:00
INSTALL.txt Reverting test commit 2013-06-07 05:33:21 +00:00
LICENSE.TXT
Makefile
ModuleInfo.txt
NOTES.txt
README.txt

README.txt

//===----------------------------------------------------------------------===//
// C Language Family Front-end
//===----------------------------------------------------------------------===//

Welcome to Clang.  This is a compiler front-end for the C family of languages
(C, C++, Objective-C, and Objective-C++) which is built as part of the LLVM
compiler infrastructure project.

Unlike many other compiler frontends, Clang is useful for a number of things
beyond just compiling code: we intend for Clang to be host to a number of
different source level tools.  One example of this is the Clang Static Analyzer.

If you're interested in more (including how to build Clang) it is best to read
the relevant web sites.  Here are some pointers:

Information on Clang:              http://clang.llvm.org/
Building and using Clang:          http://clang.llvm.org/get_started.html
Clang Static Analyzer:             http://clang-analyzer.llvm.org/
Information on the LLVM project:   http://llvm.org/

If you have questions or comments about Clang, a great place to discuss them is
on the Clang development mailing list:
  http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

If you find a bug in Clang, please file it in the LLVM bug tracker:
  http://llvm.org/bugs/