[PATCH] D112647: [clang-apply-replacements] Correctly handle relative paths
Duncan P. N. Exon Smith via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 28 18:57:03 PDT 2022
dexonsmith added inline comments.
Herald added a project: All.
================
Comment at: clang-tools-extra/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp:178
}
+ SM.getFileManager().getFileSystemOpts().WorkingDir = PrevWorkingDir;
};
----------------
This looks incorrect.
The FileManager is not designed to have the working directory change and it's not sound to change/restore it. This is because it caches the meaning of every relative-path lookup.
Consider:
```
/dir1/file1.h
/dir2/file1.h
/dir2/file2.h
```
if you do:
```
FM.WorkingDir = "/dir1";
FM.getFile("file1.h"); // returns /dir1/file1.h
FM.WorkingDir = "/dir2";
FM.getFile("file1.h"); // returns /dir1/file1.h !!!
FM.getFile("file2.h"); // returns /dir2/file2.h
```
See also the comment at https://reviews.llvm.org/D122549#3412965.
I don't know anything about clang-apply-replacements, but I have a couple of ideas for handling this correctly:
- Change the FileManager so that it's constructed with the working directory set to the build directory (don't save+restore, just make it correct from the start).
- If there are multiple concepts of a "build directory", use a different FileManager for each one.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D112647/new/
https://reviews.llvm.org/D112647
More information about the cfe-commits
mailing list