]> granicus.if.org Git - clang/commitdiff
When an included non-system directory duplicates a system directory the clang
authorChad Rosier <mcrosier@apple.com>
Mon, 10 Oct 2011 18:44:24 +0000 (18:44 +0000)
committerChad Rosier <mcrosier@apple.com>
Mon, 10 Oct 2011 18:44:24 +0000 (18:44 +0000)
frontend removes the non-system directory to maintain gcc compatibility.  When
this happens NumAngled needs to be updated.
PR11097

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141565 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Frontend/InitHeaderSearch.cpp

index 16a905e8761af61b4165b167de13c87d48362ddd..76cda2c9b35c6d01be89a0a715b9f8251536e8e3 100644 (file)
@@ -968,12 +968,14 @@ void InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang,
 }
 
 /// RemoveDuplicates - If there are duplicate directory entries in the specified
-/// search list, remove the later (dead) ones.
-static void RemoveDuplicates(std::vector<DirectoryLookup> &SearchList,
-                             unsigned First, bool Verbose) {
+/// search list, remove the later (dead) ones.  Returns the number of non-system
+/// headers removed, which is used to update NumAngled.
+static unsigned RemoveDuplicates(std::vector<DirectoryLookup> &SearchList,
+                                 unsigned First, bool Verbose) {
   llvm::SmallPtrSet<const DirectoryEntry *, 8> SeenDirs;
   llvm::SmallPtrSet<const DirectoryEntry *, 8> SeenFrameworkDirs;
   llvm::SmallPtrSet<const HeaderMap *, 8> SeenHeaderMaps;
+  unsigned NonSystemRemoved = 0;
   for (unsigned i = First; i != SearchList.size(); ++i) {
     unsigned DirToRemove = i;
 
@@ -1040,12 +1042,15 @@ static void RemoveDuplicates(std::vector<DirectoryLookup> &SearchList,
         llvm::errs() << "  as it is a non-system directory that duplicates "
                      << "a system directory\n";
     }
+    if (DirToRemove != i)
+      ++NonSystemRemoved;
 
     // This is reached if the current entry is a duplicate.  Remove the
     // DirToRemove (usually the current dir).
     SearchList.erase(SearchList.begin()+DirToRemove);
     --i;
   }
+  return NonSystemRemoved;
 }
 
 
@@ -1092,7 +1097,8 @@ void InitHeaderSearch::Realize(const LangOptions &Lang) {
   // Remove duplicates across both the Angled and System directories.  GCC does
   // this and failing to remove duplicates across these two groups breaks
   // #include_next.
-  RemoveDuplicates(SearchList, NumQuoted, Verbose);
+  unsigned NonSystemRemoved = RemoveDuplicates(SearchList, NumQuoted, Verbose);
+  NumAngled -= NonSystemRemoved;
 
   bool DontSearchCurDir = false;  // TODO: set to true if -I- is set?
   Headers.SetSearchPaths(SearchList, NumQuoted, NumAngled, DontSearchCurDir);