<div dir="ltr">Thanks, should be fixed in r203140.<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Mar 6, 2014 at 4:46 AM, Evgeniy Stepanov <span dir="ltr"><<a href="mailto:eugeni.stepanov@gmail.com" target="_blank">eugeni.stepanov@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I think this broke AddressSanitizer bootstrap:<br>
<a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/2521/steps/check-clang%20asan/logs/stdio" target="_blank">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/2521/steps/check-clang%20asan/logs/stdio</a><br>

<br>
ERROR: AddressSanitizer: heap-use-after-free on address 0x60300000dff0<br>
at pc 0x675fd7e bp 0x7fffd300c690 sp 0x7fffd300c688<br>
READ of size 2 at 0x60300000dff0 thread T0<br>
    #0 0x675fd7d in clang::HeaderSearch::LookupFile(llvm::StringRef,<br>
clang::SourceLocation, bool, clang::DirectoryLookup const*,<br>
clang::DirectoryLookup const*&, llvm::ArrayRef<clang::FileEntry<br>
const*>, llvm::SmallVectorImpl<char>*, llvm::SmallVectorImpl<char>*,<br>
clang::ModuleMap::KnownHeader*, bool)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/HeaderSearch.cpp:617<br>
    #1 0x6803045 in<br>
clang::Preprocessor::LookupFile(clang::SourceLocation,<br>
llvm::StringRef, bool, clang::DirectoryLookup const*,<br>
clang::DirectoryLookup const*&, llvm::SmallVectorImpl<char>*,<br>
llvm::SmallVectorImpl<char>*, clang::ModuleMap::KnownHeader*, bool)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/PPDirectives.cpp:598<br>
    #2 0x2aab471 in ParseDirective(llvm::StringRef,<br>
clang::VerifyDiagnosticConsumer::ExpectedData*, clang::SourceManager&,<br>
clang::Preprocessor*, clang::SourceLocation,<br>
clang::VerifyDiagnosticConsumer::DirectiveStatus&)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp:398<br>
    #3 0x2aaa50a in<br>
clang::VerifyDiagnosticConsumer::HandleComment(clang::Preprocessor&,<br>
clang::SourceRange)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp:531<br>
    #4 0x2aae35c in non-virtual thunk to<br>
clang::VerifyDiagnosticConsumer::HandleComment(clang::Preprocessor&,<br>
clang::SourceRange)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp:563<br>
    #5 0x68abe1d in clang::Preprocessor::HandleComment(clang::Token&,<br>
clang::SourceRange)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Preprocessor.cpp:817<br>
    #6 0x6784d14 in clang::Lexer::SkipLineComment(clang::Token&, char<br>
const*, bool&) /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Lexer.cpp:2131<br>
    #7 0x678e96c in clang::Lexer::LexTokenInternal(clang::Token&,<br>
bool) /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Lexer.cpp:3334<br>
    #8 0x67888e6 in clang::Lexer::Lex(clang::Token&)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Lexer.cpp:2905<br>
    #9 0x68a8d21 in clang::Preprocessor::Lex(clang::Token&)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Preprocessor.cpp:672<br>
    #10 0x4830852 in clang::ParseAST(clang::Sema&, bool, bool)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Parse/ParseAST.cpp:123<br>
    #11 0x2a21dd3 in clang::FrontendAction::Execute()<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/FrontendAction.cpp:403<br>
    #12 0x29a3d47 in<br>
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:722<br>
    #13 0x2bc3b1c in<br>
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:239<br>
    #14 0x773890 in cc1_main(char const**, char const**, char const*,<br>
void*) /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/driver/cc1_main.cpp:101<br>
    #15 0x76e2f4 in main<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/driver/driver.cpp:314<br>
    #16 0x7fbf7fd87ed4 in __libc_start_main<br>
(/lib/x86_64-linux-gnu/libc.so.6+0x21ed4)<br>
    #17 0x767d6a in _start<br>
(/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm_build_asan/bin/clang-3.5+0x767d6a)<br>
<br>
0x60300000dff0 is located 0 bytes inside of 32-byte region<br>
[0x60300000dff0,0x60300000e010)<br>
freed by thread T0 here:<br>
    #0 0x74bf60 in operator delete(void*)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/projects/compiler-rt/lib/asan/asan_new_delete.cc:94<br>
    #1 0x67671a2 in deallocate<br>
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ext/new_allocator.h:110<br>
    #2 0x67671a2 in _M_deallocate<br>
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_vector.h:174<br>
    #3 0x67671a2 in std::vector<clang::HeaderFileInfo,<br>
std::allocator<clang::HeaderFileInfo> >::_M_default_append(unsigned<br>
long) /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/vector.tcc:570<br>
    #4 0x67651cc in resize<br>
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_vector.h:667<br>
    #5 0x67651cc in<br>
clang::HeaderSearch::MarkFileModuleHeader(clang::FileEntry const*,<br>
clang::ModuleMap::ModuleHeaderRole, bool)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/HeaderSearch.cpp:989<br>
    #6 0x67d115c in clang::ModuleMap::addHeader(clang::Module*,<br>
clang::FileEntry const*, clang::ModuleMap::ModuleHeaderRole)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/ModuleMap.cpp:738<br>
    #7 0x67e5843 in<br>
clang::ModuleMapParser::parseHeaderDecl(clang::MMToken::TokenKind,<br>
clang::SourceLocation)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/ModuleMap.cpp:1664<br>
    #8 0x67d8bc3 in clang::ModuleMapParser::parseModuleDecl()<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/ModuleMap.cpp:1414<br>
    #9 0x67ea326 in clang::ModuleMapParser::parseModuleMapFile()<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/ModuleMap.cpp:2177<br>
    #10 0x67cf18b in<br>
clang::ModuleMap::parseModuleMapFile(clang::FileEntry const*, bool)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/ModuleMap.cpp:2224<br>
    #11 0x6757924 in<br>
clang::HeaderSearch::loadModuleMapFile(clang::DirectoryEntry const*,<br>
bool) /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/HeaderSearch.cpp:1189<br>
    #12 0x6765802 in<br>
clang::HeaderSearch::hasModuleMap(llvm::StringRef,<br>
clang::DirectoryEntry const*, bool)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/HeaderSearch.cpp:1066<br>
    #13 0x675a8fc in getFileAndSuggestModule(clang::HeaderSearch&,<br>
llvm::StringRef, clang::DirectoryEntry const*, bool,<br>
clang::ModuleMap::KnownHeader*)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/HeaderSearch.cpp:228<br>
    #14 0x675dd85 in clang::HeaderSearch::LookupFile(llvm::StringRef,<br>
clang::SourceLocation, bool, clang::DirectoryLookup const*,<br>
clang::DirectoryLookup const*&, llvm::ArrayRef<clang::FileEntry<br>
const*>, llvm::SmallVectorImpl<char>*, llvm::SmallVectorImpl<char>*,<br>
clang::ModuleMap::KnownHeader*, bool)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/HeaderSearch.cpp:608<br>
    #15 0x6803045 in<br>
clang::Preprocessor::LookupFile(clang::SourceLocation,<br>
llvm::StringRef, bool, clang::DirectoryLookup const*,<br>
clang::DirectoryLookup const*&, llvm::SmallVectorImpl<char>*,<br>
llvm::SmallVectorImpl<char>*, clang::ModuleMap::KnownHeader*, bool)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/PPDirectives.cpp:598<br>
    #16 0x2aab471 in ParseDirective(llvm::StringRef,<br>
clang::VerifyDiagnosticConsumer::ExpectedData*, clang::SourceManager&,<br>
clang::Preprocessor*, clang::SourceLocation,<br>
clang::VerifyDiagnosticConsumer::DirectiveStatus&)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp:398<br>
    #17 0x2aaa50a in<br>
clang::VerifyDiagnosticConsumer::HandleComment(clang::Preprocessor&,<br>
clang::SourceRange)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp:531<br>
    #18 0x2aae35c in non-virtual thunk to<br>
clang::VerifyDiagnosticConsumer::HandleComment(clang::Preprocessor&,<br>
clang::SourceRange)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/VerifyDiagnosticConsumer.cpp:563<br>
    #19 0x68abe1d in clang::Preprocessor::HandleComment(clang::Token&,<br>
clang::SourceRange)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Preprocessor.cpp:817<br>
    #20 0x6784d14 in clang::Lexer::SkipLineComment(clang::Token&, char<br>
const*, bool&) /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Lexer.cpp:2131<br>
    #21 0x678e96c in clang::Lexer::LexTokenInternal(clang::Token&,<br>
bool) /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Lexer.cpp:3334<br>
    #22 0x67888e6 in clang::Lexer::Lex(clang::Token&)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Lexer.cpp:2905<br>
    #23 0x68a8d21 in clang::Preprocessor::Lex(clang::Token&)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Preprocessor.cpp:672<br>
    #24 0x4830852 in clang::ParseAST(clang::Sema&, bool, bool)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Parse/ParseAST.cpp:123<br>
    #25 0x2a21dd3 in clang::FrontendAction::Execute()<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/FrontendAction.cpp:403<br>
    #26 0x29a3d47 in<br>
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:722<br>
    #27 0x2bc3b1c in<br>
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:239<br>
    #28 0x773890 in cc1_main(char const**, char const**, char const*,<br>
void*) /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/driver/cc1_main.cpp:101<br>
    #29 0x76e2f4 in main<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/driver/driver.cpp:314<br>
    #30 0x7fbf7fd87ed4 in __libc_start_main<br>
(/lib/x86_64-linux-gnu/libc.so.6+0x21ed4)<br>
<br>
previously allocated by thread T0 here:<br>
    #0 0x74b9e0 in operator new(unsigned long)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/projects/compiler-rt/lib/asan/asan_new_delete.cc:62<br>
    #1 0x6766fcd in allocate<br>
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/ext/new_allocator.h:104<br>
    #2 0x6766fcd in _M_allocate<br>
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_vector.h:168<br>
    #3 0x6766fcd in std::vector<clang::HeaderFileInfo,<br>
std::allocator<clang::HeaderFileInfo> >::_M_default_append(unsigned<br>
long) /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/vector.tcc:549<br>
    #4 0x67615a2 in resize<br>
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_vector.h:667<br>
    #5 0x67615a2 in clang::HeaderSearch::getFileInfo(clang::FileEntry<br>
const*) /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/HeaderSearch.cpp:963<br>
    #6 0x68a5df1 in IncrementIncludeCount<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/include/clang/Lex/HeaderSearch.h:438<br>
    #7 0x68a5df1 in clang::Preprocessor::EnterMainSourceFile()<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Lex/Preprocessor.cpp:481<br>
    #8 0x4830845 in clang::ParseAST(clang::Sema&, bool, bool)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Parse/ParseAST.cpp:122<br>
    #9 0x2a21dd3 in clang::FrontendAction::Execute()<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/FrontendAction.cpp:403<br>
    #10 0x29a3d47 in<br>
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:722<br>
    #11 0x2bc3b1c in<br>
clang::ExecuteCompilerInvocation(clang::CompilerInstance*)<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:239<br>
    #12 0x773890 in cc1_main(char const**, char const**, char const*,<br>
void*) /home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/driver/cc1_main.cpp:101<br>
    #13 0x76e2f4 in main<br>
/home/dtoolsbot/build/sanitizer-x86_64-linux-bootstrap/build/llvm/tools/clang/tools/driver/driver.cpp:314<br>
    #14 0x7fbf7fd87ed4 in __libc_start_main<br>
(/lib/x86_64-linux-gnu/libc.so.6+0x21ed4)<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On Thu, Mar 6, 2014 at 12:51 AM, Richard Smith<br>
<<a href="mailto:richard-llvm@metafoo.co.uk">richard-llvm@metafoo.co.uk</a>> wrote:<br>
> Author: rsmith<br>
> Date: Wed Mar  5 14:51:45 2014<br>
> New Revision: 203005<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=203005&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=203005&view=rev</a><br>
> Log:<br>
> If a #include finds a file relative to the current file, don't forget to check<br>
> whether it's part of a module.<br>
><br>
> Added:<br>
>     cfe/trunk/test/Modules/Inputs/recursive1.h<br>
>     cfe/trunk/test/Modules/Inputs/recursive2.h<br>
>     cfe/trunk/test/Modules/recursive.c<br>
> Modified:<br>
>     cfe/trunk/lib/Lex/HeaderSearch.cpp<br>
>     cfe/trunk/lib/Lex/ModuleMap.cpp<br>
>     cfe/trunk/test/Modules/Inputs/module.map<br>
>     cfe/trunk/test/Modules/submodules.cpp<br>
><br>
> Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=203005&r1=203004&r2=203005&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=203005&r1=203004&r2=203005&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Lex/HeaderSearch.cpp (original)<br>
> +++ cfe/trunk/lib/Lex/HeaderSearch.cpp Wed Mar  5 14:51:45 2014<br>
> @@ -219,6 +219,32 @@ const char *DirectoryLookup::getName() c<br>
>    return getHeaderMap()->getFileName();<br>
>  }<br>
><br>
> +static const FileEntry *<br>
> +getFileAndSuggestModule(HeaderSearch &HS, StringRef FileName,<br>
> +                        const DirectoryEntry *Dir, bool IsSystemHeaderDir,<br>
> +                        ModuleMap::KnownHeader *SuggestedModule) {<br>
> +  // If we have a module map that might map this header, load it and<br>
> +  // check whether we'll have a suggestion for a module.<br>
> +  HS.hasModuleMap(FileName, Dir, IsSystemHeaderDir);<br>
> +  if (SuggestedModule) {<br>
> +    const FileEntry *File = HS.getFileMgr().getFile(FileName,<br>
> +                                                    /*OpenFile=*/false);<br>
> +    if (File) {<br>
> +      // If there is a module that corresponds to this header, suggest it.<br>
> +      *SuggestedModule = HS.findModuleForHeader(File);<br>
> +<br>
> +      // FIXME: This appears to be a no-op. We loaded the module map for this<br>
> +      // directory at the start of this function.<br>
> +      if (!SuggestedModule->getModule() &&<br>
> +          HS.hasModuleMap(FileName, Dir, IsSystemHeaderDir))<br>
> +        *SuggestedModule = HS.findModuleForHeader(File);<br>
> +    }<br>
> +<br>
> +    return File;<br>
> +  }<br>
> +<br>
> +  return HS.getFileMgr().getFile(FileName, /*openFile=*/true);<br>
> +}<br>
><br>
>  /// LookupFile - Lookup the specified file in this search path, returning it<br>
>  /// if it exists or returning null if not.<br>
> @@ -246,25 +272,10 @@ const FileEntry *DirectoryLookup::Lookup<br>
>        RelativePath->clear();<br>
>        RelativePath->append(Filename.begin(), Filename.end());<br>
>      }<br>
> -<br>
> -    // If we have a module map that might map this header, load it and<br>
> -    // check whether we'll have a suggestion for a module.<br>
> -    HS.hasModuleMap(TmpDir, getDir(), isSystemHeaderDirectory());<br>
> -    if (SuggestedModule) {<br>
> -      const FileEntry *File = HS.getFileMgr().getFile(TmpDir.str(),<br>
> -                                                      /*openFile=*/false);<br>
> -      if (!File)<br>
> -        return File;<br>
> -<br>
> -      // If there is a module that corresponds to this header, suggest it.<br>
> -      *SuggestedModule = HS.findModuleForHeader(File);<br>
> -      if (!SuggestedModule->getModule() &&<br>
> -          HS.hasModuleMap(TmpDir, getDir(), isSystemHeaderDirectory()))<br>
> -        *SuggestedModule = HS.findModuleForHeader(File);<br>
> -      return File;<br>
> -    }<br>
> -<br>
> -    return HS.getFileMgr().getFile(TmpDir.str(), /*openFile=*/true);<br>
> +<br>
> +    return getFileAndSuggestModule(HS, TmpDir.str(), getDir(),<br>
> +                                   isSystemHeaderDirectory(),<br>
> +                                   SuggestedModule);<br>
>    }<br>
><br>
>    if (isFramework())<br>
> @@ -573,6 +584,7 @@ const FileEntry *HeaderSearch::LookupFil<br>
><br>
>    // This is the header that MSVC's header search would have found.<br>
>    const FileEntry *MSFE = 0;<br>
> +  ModuleMap::KnownHeader MSSuggestedModule;<br>
><br>
>    // Unless disabled, check to see if the file is in the #includer's<br>
>    // directory.  This cannot be based on CurDir, because each includer could be<br>
> @@ -590,15 +602,18 @@ const FileEntry *HeaderSearch::LookupFil<br>
>        TmpDir = Includer->getDir()->getName();<br>
>        TmpDir.push_back('/');<br>
>        TmpDir.append(Filename.begin(), Filename.end());<br>
> +<br>
> +      HeaderFileInfo &FromHFI = getFileInfo(Includer);<br>
>        if (const FileEntry *FE =<br>
> -              FileMgr.getFile(TmpDir.str(), /*openFile=*/true)) {<br>
> +              getFileAndSuggestModule(*this, TmpDir.str(), Includer->getDir(),<br>
> +                                      FromHFI.DirInfo != SrcMgr::C_User,<br>
> +                                      SuggestedModule)) {<br>
>          // Leave CurDir unset.<br>
>          // This file is a system header or C++ unfriendly if the old file is.<br>
>          //<br>
>          // Note that we only use one of FromHFI/ToHFI at once, due to potential<br>
>          // reallocation of the underlying vector potentially making the first<br>
>          // reference binding dangling.<br>
> -        HeaderFileInfo &FromHFI = getFileInfo(Includer);<br>
>          unsigned DirInfo = FromHFI.DirInfo;<br>
>          bool IndexHeaderMapHeader = FromHFI.IndexHeaderMapHeader;<br>
>          StringRef Framework = FromHFI.Framework;<br>
> @@ -629,6 +644,10 @@ const FileEntry *HeaderSearch::LookupFil<br>
>            return FE;<br>
>          } else {<br>
>            MSFE = FE;<br>
> +          if (SuggestedModule) {<br>
> +            MSSuggestedModule = *SuggestedModule;<br>
> +            *SuggestedModule = ModuleMap::KnownHeader();<br>
> +          }<br>
>            break;<br>
>          }<br>
>        }<br>
> @@ -709,8 +728,11 @@ const FileEntry *HeaderSearch::LookupFil<br>
>        }<br>
>      }<br>
><br>
> -    if (checkMSVCHeaderSearch(Diags, MSFE, FE, IncludeLoc))<br>
> +    if (checkMSVCHeaderSearch(Diags, MSFE, FE, IncludeLoc)) {<br>
> +      if (SuggestedModule)<br>
> +        *SuggestedModule = MSSuggestedModule;<br>
>        return MSFE;<br>
> +    }<br>
><br>
>      // Remember this location for the next lookup we do.<br>
>      CacheLookup.second = i;<br>
> @@ -734,19 +756,26 @@ const FileEntry *HeaderSearch::LookupFil<br>
>            ScratchFilename, IncludeLoc, /*isAngled=*/true, FromDir, CurDir,<br>
>            Includers.front(), SearchPath, RelativePath, SuggestedModule);<br>
><br>
> -      if (checkMSVCHeaderSearch(Diags, MSFE, FE, IncludeLoc))<br>
> +      if (checkMSVCHeaderSearch(Diags, MSFE, FE, IncludeLoc)) {<br>
> +        if (SuggestedModule)<br>
> +          *SuggestedModule = MSSuggestedModule;<br>
>          return MSFE;<br>
> +      }<br>
><br>
>        std::pair<unsigned, unsigned> &CacheLookup<br>
>          = LookupFileCache.GetOrCreateValue(Filename).getValue();<br>
>        CacheLookup.second<br>
>          = LookupFileCache.GetOrCreateValue(ScratchFilename).getValue().second;<br>
> +      // FIXME: SuggestedModule.<br>
>        return FE;<br>
>      }<br>
>    }<br>
><br>
> -  if (checkMSVCHeaderSearch(Diags, MSFE, 0, IncludeLoc))<br>
> +  if (checkMSVCHeaderSearch(Diags, MSFE, 0, IncludeLoc)) {<br>
> +    if (SuggestedModule)<br>
> +      *SuggestedModule = MSSuggestedModule;<br>
>      return MSFE;<br>
> +  }<br>
><br>
>    // Otherwise, didn't find it. Remember we didn't find this.<br>
>    CacheLookup.second = SearchDirs.size();<br>
><br>
> Modified: cfe/trunk/lib/Lex/ModuleMap.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=203005&r1=203004&r2=203005&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=203005&r1=203004&r2=203005&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Lex/ModuleMap.cpp (original)<br>
> +++ cfe/trunk/lib/Lex/ModuleMap.cpp Wed Mar  5 14:51:45 2014<br>
> @@ -297,6 +297,8 @@ ModuleMap::findModuleForHeader(const Fil<br>
>        Result = *I;<br>
>        // If 'File' is a public header of this module, this is as good as we<br>
>        // are going to get.<br>
> +      // FIXME: If we have a RequestingModule, we should prefer the header from<br>
> +      // that module.<br>
>        if (I->getRole() == ModuleMap::NormalHeader)<br>
>          break;<br>
>      }<br>
><br>
> Modified: cfe/trunk/test/Modules/Inputs/module.map<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=203005&r1=203004&r2=203005&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=203005&r1=203004&r2=203005&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Modules/Inputs/module.map (original)<br>
> +++ cfe/trunk/test/Modules/Inputs/module.map Wed Mar  5 14:51:45 2014<br>
> @@ -290,3 +290,9 @@ module recursive_visibility_b {<br>
>  module recursive_visibility_c {<br>
>    header "recursive_visibility_c.h"<br>
>  }<br>
> +module recursive1 {<br>
> +  header "recursive1.h"<br>
> +}<br>
> +module recursive2 {<br>
> +  header "recursive2.h"<br>
> +}<br>
><br>
> Added: cfe/trunk/test/Modules/Inputs/recursive1.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/recursive1.h?rev=203005&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/recursive1.h?rev=203005&view=auto</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Modules/Inputs/recursive1.h (added)<br>
> +++ cfe/trunk/test/Modules/Inputs/recursive1.h Wed Mar  5 14:51:45 2014<br>
> @@ -0,0 +1 @@<br>
> +#include "recursive2.h"<br>
><br>
> Added: cfe/trunk/test/Modules/Inputs/recursive2.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/recursive2.h?rev=203005&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/recursive2.h?rev=203005&view=auto</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Modules/Inputs/recursive2.h (added)<br>
> +++ cfe/trunk/test/Modules/Inputs/recursive2.h Wed Mar  5 14:51:45 2014<br>
> @@ -0,0 +1 @@<br>
> +#include "recursive1.h"<br>
><br>
> Added: cfe/trunk/test/Modules/recursive.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/recursive.c?rev=203005&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/recursive.c?rev=203005&view=auto</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Modules/recursive.c (added)<br>
> +++ cfe/trunk/test/Modules/recursive.c Wed Mar  5 14:51:45 2014<br>
> @@ -0,0 +1,11 @@<br>
> +// RUN: rm -rf %t<br>
> +// RUN: not %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -I %S/Inputs %s 2>&1 | FileCheck %s<br>
> +#include "recursive1.h"<br>
> +<br>
> +// FIXME: rm -rf %t<br>
> +// FIXME: not %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -emit-module -fmodule-name=recursive1 %S/Inputs/module.map 2>&1 | FileCheck %s<br>
> +<br>
> +// CHECK:      While building module 'recursive1'{{( imported from .*/recursive.c:3)?}}:<br>
> +// CHECK-NEXT: While building module 'recursive2' imported from {{.*}}Inputs/recursive1.h:1:<br>
> +// CHECK-NEXT: In file included from <module-includes>:1:<br>
> +// CHECK-NEXT: recursive2.h:1:10: fatal error: cyclic dependency in module 'recursive1': recursive1 -> recursive2 -> recursive1<br>
><br>
> Modified: cfe/trunk/test/Modules/submodules.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/submodules.cpp?rev=203005&r1=203004&r2=203005&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/submodules.cpp?rev=203005&r1=203004&r2=203005&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Modules/submodules.cpp (original)<br>
> +++ cfe/trunk/test/Modules/submodules.cpp Wed Mar  5 14:51:45 2014<br>
> @@ -31,9 +31,7 @@ hash_map<int, float> ints_to_floats2;<br>
>  extern MyTypeA import_self_test_a; // expected-error {{must be imported from module 'import_self.a'}}<br>
>  // expected-note@import-self-a.h:1 {{here}}<br>
>  extern MyTypeC import_self_test_c;<br>
> -// FIXME: This should be valid; import_self.b re-exports import_self.d.<br>
> -extern MyTypeD import_self_test_d; // expected-error {{must be imported from module 'import_self.d'}}<br>
> -// expected-note@import-self-d.h:1 {{here}}<br>
> +extern MyTypeD import_self_test_d;<br>
><br>
>  // expected-error@Inputs/submodules/module.map:15{{header 'missing.h' not found}}<br>
>  @import missing_headers.missing;<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br></div>