Index: clang-tools-extra/trunk/include-fixer/IncludeFixer.cpp =================================================================== --- clang-tools-extra/trunk/include-fixer/IncludeFixer.cpp +++ clang-tools-extra/trunk/include-fixer/IncludeFixer.cpp @@ -86,6 +86,29 @@ if (getCompilerInstance().getSema().isSFINAEContext()) return clang::TypoCorrection(); + // We currently ignore the unidentified symbol which is not from the + // main file. + // + // However, this is not always true due to templates in a non-self contained + // header, consider the case: + // + // // header.h + // template + // class Foo { + // T t; + // }; + // + // // test.cc + // // We need to add in test.cc instead of header.h. + // class Bar; + // Foo foo; + // + // FIXME: Add the missing header to the header file where the symbol comes + // from. + if (!getCompilerInstance().getSourceManager().isWrittenInMainFile( + Typo.getLoc())) + return clang::TypoCorrection(); + std::string TypoScopeString; if (S) { // FIXME: Currently we only use namespace contexts. Use other context Index: clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp =================================================================== --- clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp +++ clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp @@ -44,6 +44,8 @@ llvm::MemoryBuffer::getMemBuffer("\n")); InMemoryFileSystem->addFile("dir/otherdir/qux.h", 0, llvm::MemoryBuffer::getMemBuffer("\n")); + InMemoryFileSystem->addFile("header.h", 0, + llvm::MemoryBuffer::getMemBuffer("bar b;")); return Invocation.run(); } @@ -186,6 +188,11 @@ runIncludeFixer("int test = a::b::Green;\n")); } +TEST(IncludeFixer, IgnoreSymbolFromHeader) { + std::string Code = "#include \"header.h\""; + EXPECT_EQ(Code, runIncludeFixer(Code)); +} + // FIXME: add test cases for inserting and sorting multiple headers when // include-fixer supports multiple headers insertion. TEST(IncludeFixer, InsertAndSortSingleHeader) {