rsmith added a comment.

In https://reviews.llvm.org/D50740#1203126, @arphaman wrote:

> In https://reviews.llvm.org/D50740#1202248, @jkorous wrote:
>
> > Hi Alex, nice work!
> >
> > I am just wondering if it would be beneficial to assert Loc and End are in 
> > the same file. It might help to catch bugs.
>
>
> I don't see the value in that unless I'm misunderstanding something. We 
> already check if Loc and End are in the same file, and return false if 
> they're not.


I think we should assert that `Start` and `End` are in the same file. If not, 
the query doesn't make any sense; the range is malformed. And maybe we should 
also assert that `Start` is before `End` in that file.



================
Comment at: include/clang/Basic/SourceManager.h:1585-1586
+  /// located in the same inclusion span as the range).
   bool isPointWithin(SourceLocation Location, SourceLocation Start,
-                     SourceLocation End) const {
-    return Location == Start || Location == End ||
-           (isBeforeInTranslationUnit(Start, Location) &&
-            isBeforeInTranslationUnit(Location, End));
-  }
+                     SourceLocation End) const;
 
----------------
Please rename this function to make it clearer what it's doing. The old 
implementation is the obvious one for a function with this name. Maybe 
`isSpellingLocInFileRange` or similar?


================
Comment at: lib/Basic/SourceManager.cpp:2038-2050
+  auto isOrderedInSameFile =
+      [&](SourceLocation RangeLoc,
+          llvm::function_ref<bool(unsigned, unsigned)> Comparator) {
+        std::pair<FileID, unsigned> DecomposedRangeLoc =
+            getDecomposedLoc(getSpellingLoc(RangeLoc));
+        // Ensure that we check for FileEntry equivalency to account for
+        // multiple inclusions.
----------------
Does this do the right thing if both points are within (eg) macro expansion 
ranges in the same file? Eg, given:

```
// A
#define FOO BAR
// B
FOO
// C
```

is the macro-expanded `BAR` token between `B` and `C`? Is it between `A` and 
`B`?

I would guess that the intended semantics here are:

 * `Start` and `End` are expected to be file locations in the same inclusion of 
the same file, with `Start` occuring no later than `End`.
 * `Loc` is an arbitrary location.
 * Function returns `true` if the spelling location of `Loc` is in the same 
source file as `Start` and `End`, and occurs between them; `false` otherwise.

Is that right? If so, please write that down somewhere; the current function 
comment is too vague. (And if not, please write down what the intended rule is.)


Repository:
  rC Clang

https://reviews.llvm.org/D50740



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

Reply via email to