================
@@ -832,13 +835,11 @@ FileID 
SourceManager::getFileIDLocal(SourceLocation::UIntTy SLocOffset) const {
   unsigned LessIndex = 0;
   // upper bound of the search range.
   unsigned GreaterIndex = LocalSLocEntryTable.size();
-  if (LastFileIDLookup.ID >= 0) {
-    // Use the LastFileIDLookup to prune the search space.
-    if (LocalSLocEntryTable[LastFileIDLookup.ID].getOffset() < SLocOffset)
-      LessIndex = LastFileIDLookup.ID;
-    else
-      GreaterIndex = LastFileIDLookup.ID;
-  }
+  // Use the LastFileIDLookup to prune the search space.
+  if (LastLookupStartOffset < SLocOffset)
+    LessIndex = LastFileIDLookup.ID;
----------------
hokein wrote:

`ID` cannot be negative here — `LastFileIDLookup` is only a cache for the 
**local** SLoc entry table, not the `Loaded` one.

When there is no cached entry yet, the state is:

* Both `LastLookupStartOffset` and `LastLookupEndOffset` are `0`.
* `LastFileIDLookup` is initialized to an invalid value (i.e., 
`LastFileIDLookup.ID` is `0`).

The only possible bug here would be if `SLocOffset` were `0`. In that case, 
`GreaterIndex` would be set to `0`, and the subsequent `--GreaterIndex;` would 
cause an out-of-bounds access on `LocalSLocEntryTable`.

However, this can't happen in practice: `SLocOffset` is guaranteed to be 
non-zero in this function, as ensured by the guard here:
[https://github.com/llvm/llvm-project/blob/main/clang/lib/Basic/SourceManager.cpp#L789-L790](https://github.com/llvm/llvm-project/blob/main/clang/lib/Basic/SourceManager.cpp#L789-L790)

I’ve also added some assertions to clarify this in the code.


https://github.com/llvm/llvm-project/pull/146782
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to