sammccall added a comment.

This is a subtle change that needs careful review, and honestly should have a 
test.

I realize there's a breakage that needs to be fixed with some urgency and you 
believe you're just restoring the old behavior, however in that case the right 
course of action is to revert the patch.
As it turns out I think this introduces a bug when offset space is nearly full.



================
Comment at: clang/lib/Lex/TokenLexer.cpp:1009
+      if (T.getLocation().isFileID()) {
+        unsigned distance =
+            T.getLocation().getRawEncoding() - LastLoc.getRawEncoding();
----------------
distance -> Distance


================
Comment at: clang/lib/Lex/TokenLexer.cpp:1010
+        unsigned distance =
+            T.getLocation().getRawEncoding() - LastLoc.getRawEncoding();
+        LastLoc = T.getLocation();
----------------
This seems to be missing the same-sloc-address-space check: it can create a 
single file ID spanning a local and loaded sloc entry, which will be corrupted 
by saving+loading



================
Comment at: clang/lib/Lex/TokenLexer.cpp:1010
+        unsigned distance =
+            T.getLocation().getRawEncoding() - LastLoc.getRawEncoding();
+        LastLoc = T.getLocation();
----------------
sammccall wrote:
> This seems to be missing the same-sloc-address-space check: it can create a 
> single file ID spanning a local and loaded sloc entry, which will be 
> corrupted by saving+loading
> 
(getOffset() would be much clearly correct than getRawEncoding())


================
Comment at: clang/lib/Lex/TokenLexer.cpp:1022
         SM.getComposedLoc(BeginFID, SM.getFileIDSize(BeginFID));
+    SourceLocation LastLoc = BeginLoc;
     Partition = All.take_while([&](const Token &T) {
----------------
having worked quite hard to make this code readable, copy/pasting the same 
(buggy) algorithm in both places seems like an unfortunate choice.

I'd suggest:
```
auto NearLast = [&, Last{BeginLoc}](SourceLocation Loc) mutable {
  constexpr int Limit = 50;
  SourceLocation IntTy  RelOffs;
  if (!SM.isInSameSLocAddrSpace(Last, Loc, &RelOffs) || RelOffs < 0 || RelOffs 
> Limit)
    return false;
  Last = Loc;
  return true;
};

...
Partition = All.take_while([&]{
  return T.getLocation() >= BeginLoc && T.getLocation() < Limit && 
NearLast(T.getLocation());
});
```

Here NearLast can be shared between both branches.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D136539/new/

https://reviews.llvm.org/D136539

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to