[clang] 1dc0a1e - Revert "[Lex] Fix suggested spelling of /usr/bin/../include/foo"

Sam McCall via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 25 05:01:47 PST 2022


Author: Sam McCall
Date: 2022-11-25T14:01:39+01:00
New Revision: 1dc0a1e5d220b83c1074204bd3afd54f3bac4270

URL: https://github.com/llvm/llvm-project/commit/1dc0a1e5d220b83c1074204bd3afd54f3bac4270
DIFF: https://github.com/llvm/llvm-project/commit/1dc0a1e5d220b83c1074204bd3afd54f3bac4270.diff

LOG: Revert "[Lex] Fix suggested spelling of /usr/bin/../include/foo"

This reverts commit 8bed59c7e7da2fea41a9167e15c15a8f58a5ede7.

Breaks bots e.g. https://lab.llvm.org/buildbot/#/builders/216/builds/13282

Added: 
    

Modified: 
    clang/lib/Lex/HeaderSearch.cpp
    clang/unittests/Lex/HeaderSearchTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp
index 0615002734e94..e6af122949709 100644
--- a/clang/lib/Lex/HeaderSearch.cpp
+++ b/clang/lib/Lex/HeaderSearch.cpp
@@ -1928,24 +1928,32 @@ std::string HeaderSearch::suggestPathToFileForDiagnostics(
     llvm::StringRef File, llvm::StringRef WorkingDir, llvm::StringRef MainFile,
     bool *IsSystem) {
   using namespace llvm::sys;
-  
-  llvm::SmallString<32> FilePath = File;
-  path::remove_dots(FilePath, /*remove_dot_dot=*/true);
-  File = FilePath;
 
   unsigned BestPrefixLength = 0;
   // Checks whether `Dir` is a strict path prefix of `File`. If so and that's
   // the longest prefix we've seen so for it, returns true and updates the
   // `BestPrefixLength` accordingly.
-  auto CheckDir = [&](llvm::SmallString<32> Dir) -> bool {
+  auto CheckDir = [&](llvm::StringRef Dir) -> bool {
+    llvm::SmallString<32> DirPath(Dir.begin(), Dir.end());
     if (!WorkingDir.empty() && !path::is_absolute(Dir))
-      fs::make_absolute(WorkingDir, Dir);
-    path::remove_dots(Dir, /*remove_dot_dot=*/true);
+      fs::make_absolute(WorkingDir, DirPath);
+    path::remove_dots(DirPath, /*remove_dot_dot=*/true);
+    Dir = DirPath;
     for (auto NI = path::begin(File), NE = path::end(File),
               DI = path::begin(Dir), DE = path::end(Dir);
-         NI != NE; ++NI, ++DI) {
+         /*termination condition in loop*/; ++NI, ++DI) {
+      // '.' components in File are ignored.
+      while (NI != NE && *NI == ".")
+        ++NI;
+      if (NI == NE)
+        break;
+
+      // '.' components in Dir are ignored.
+      while (DI != DE && *DI == ".")
+        ++DI;
       if (DI == DE) {
-        // Dir is a prefix of File, up to choice of path separators.
+        // Dir is a prefix of File, up to '.' components and choice of path
+        // separators.
         unsigned PrefixLength = NI - path::begin(File);
         if (PrefixLength > BestPrefixLength) {
           BestPrefixLength = PrefixLength;

diff  --git a/clang/unittests/Lex/HeaderSearchTest.cpp b/clang/unittests/Lex/HeaderSearchTest.cpp
index 939f5a7210d8a..5024f0d3d6b00 100644
--- a/clang/unittests/Lex/HeaderSearchTest.cpp
+++ b/clang/unittests/Lex/HeaderSearchTest.cpp
@@ -150,14 +150,6 @@ TEST_F(HeaderSearchTest, DotDotsWithAbsPath) {
             "z");
 }
 
-TEST_F(HeaderSearchTest, BothDotDots) {
-  addSearchDir("/x/../y/");
-  EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/../y/z",
-                                                   /*WorkingDir=*/"",
-                                                   /*MainFile=*/""),
-            "z");
-}
-
 TEST_F(HeaderSearchTest, IncludeFromSameDirectory) {
   EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/y/z/t.h",
                                                    /*WorkingDir=*/"",


        


More information about the cfe-commits mailing list