https://github.com/upsj updated https://github.com/llvm/llvm-project/pull/177400

>From 9615e09e8a61a564c2fbaa31967f505590c6beaa Mon Sep 17 00:00:00 2001
From: Tobias Ribizel <[email protected]>
Date: Thu, 22 Jan 2026 17:41:44 +0100
Subject: [PATCH 1/5] [clang] format SourceLocation.h

---
 clang/include/clang/Basic/SourceLocation.h | 133 ++++++++++-----------
 1 file changed, 61 insertions(+), 72 deletions(-)

diff --git a/clang/include/clang/Basic/SourceLocation.h 
b/clang/include/clang/Basic/SourceLocation.h
index bd0038d5ae1ae..aab021ad7b610 100644
--- a/clang/include/clang/Basic/SourceLocation.h
+++ b/clang/include/clang/Basic/SourceLocation.h
@@ -104,7 +104,7 @@ class SourceLocation {
   enum : UIntTy { MacroIDBit = 1ULL << (8 * sizeof(UIntTy) - 1) };
 
 public:
-  bool isFileID() const  { return (ID & MacroIDBit) == 0; }
+  bool isFileID() const { return (ID & MacroIDBit) == 0; }
   bool isMacroID() const { return (ID & MacroIDBit) != 0; }
 
   /// Return true if this is a valid SourceLocation object.
@@ -137,9 +137,9 @@ class SourceLocation {
   /// Return a source location with the specified offset from this
   /// SourceLocation.
   SourceLocation getLocWithOffset(IntTy Offset) const {
-    assert(((getOffset()+Offset) & MacroIDBit) == 0 && "offset overflow");
+    assert(((getOffset() + Offset) & MacroIDBit) == 0 && "offset overflow");
     SourceLocation L;
-    L.ID = ID+Offset;
+    L.ID = ID + Offset;
     return L;
   }
 
@@ -165,10 +165,10 @@ class SourceLocation {
   ///
   /// This should only be passed to SourceLocation::getFromPtrEncoding, it
   /// should not be inspected directly.
-  void* getPtrEncoding() const {
+  void *getPtrEncoding() const {
     // Double cast to avoid a warning "cast to pointer from integer of 
different
     // size".
-    return (void*)(uintptr_t)getRawEncoding();
+    return (void *)(uintptr_t)getRawEncoding();
   }
 
   /// Turn a pointer encoding of a SourceLocation object back
@@ -230,13 +230,9 @@ class SourceRange {
   bool isValid() const { return B.isValid() && E.isValid(); }
   bool isInvalid() const { return !isValid(); }
 
-  bool operator==(const SourceRange &X) const {
-    return B == X.B && E == X.E;
-  }
+  bool operator==(const SourceRange &X) const { return B == X.B && E == X.E; }
 
-  bool operator!=(const SourceRange &X) const {
-    return B != X.B || E != X.E;
-  }
+  bool operator!=(const SourceRange &X) const { return B != X.B || E != X.E; }
 
   // Returns true iff other is wholly contained within this range.
   bool fullyContains(const SourceRange &other) const {
@@ -446,7 +442,7 @@ class FullSourceLoc : public SourceLocation {
 
   /// Comparison function class, useful for sorting FullSourceLocs.
   struct BeforeThanCompare {
-    bool operator()(const FullSourceLoc& lhs, const FullSourceLoc& rhs) const {
+    bool operator()(const FullSourceLoc &lhs, const FullSourceLoc &rhs) const {
       return lhs.isBeforeInTranslationUnitThan(rhs);
     }
   };
@@ -456,14 +452,12 @@ class FullSourceLoc : public SourceLocation {
   /// This is useful for debugging.
   void dump() const;
 
-  friend bool
-  operator==(const FullSourceLoc &LHS, const FullSourceLoc &RHS) {
+  friend bool operator==(const FullSourceLoc &LHS, const FullSourceLoc &RHS) {
     return LHS.getRawEncoding() == RHS.getRawEncoding() &&
-          LHS.SrcMgr == RHS.SrcMgr;
+           LHS.SrcMgr == RHS.SrcMgr;
   }
 
-  friend bool
-  operator!=(const FullSourceLoc &LHS, const FullSourceLoc &RHS) {
+  friend bool operator!=(const FullSourceLoc &LHS, const FullSourceLoc &RHS) {
     return !(LHS == RHS);
   }
 };
@@ -472,73 +466,68 @@ class FullSourceLoc : public SourceLocation {
 
 namespace llvm {
 
-  /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
-  /// DenseSets.
-  template <>
-  struct DenseMapInfo<clang::FileID, void> {
-    static clang::FileID getEmptyKey() {
-      return {};
-    }
+/// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
+/// DenseSets.
+template <> struct DenseMapInfo<clang::FileID, void> {
+  static clang::FileID getEmptyKey() { return {}; }
 
-    static clang::FileID getTombstoneKey() {
-      return clang::FileID::getSentinel();
-    }
+  static clang::FileID getTombstoneKey() {
+    return clang::FileID::getSentinel();
+  }
 
-    static unsigned getHashValue(clang::FileID S) {
-      return S.getHashValue();
-    }
+  static unsigned getHashValue(clang::FileID S) { return S.getHashValue(); }
 
-    static bool isEqual(clang::FileID LHS, clang::FileID RHS) {
-      return LHS == RHS;
-    }
-  };
+  static bool isEqual(clang::FileID LHS, clang::FileID RHS) {
+    return LHS == RHS;
+  }
+};
 
-  /// Define DenseMapInfo so that SourceLocation's can be used as keys in
-  /// DenseMap and DenseSet. This trait class is eqivalent to
-  /// DenseMapInfo<unsigned> which uses SourceLocation::ID is used as a key.
-  template <> struct DenseMapInfo<clang::SourceLocation, void> {
-    static clang::SourceLocation getEmptyKey() {
-      constexpr clang::SourceLocation::UIntTy Zero = 0;
-      return clang::SourceLocation::getFromRawEncoding(~Zero);
-    }
+/// Define DenseMapInfo so that SourceLocation's can be used as keys in
+/// DenseMap and DenseSet. This trait class is eqivalent to
+/// DenseMapInfo<unsigned> which uses SourceLocation::ID is used as a key.
+template <> struct DenseMapInfo<clang::SourceLocation, void> {
+  static clang::SourceLocation getEmptyKey() {
+    constexpr clang::SourceLocation::UIntTy Zero = 0;
+    return clang::SourceLocation::getFromRawEncoding(~Zero);
+  }
 
-    static clang::SourceLocation getTombstoneKey() {
-      constexpr clang::SourceLocation::UIntTy Zero = 0;
-      return clang::SourceLocation::getFromRawEncoding(~Zero - 1);
-    }
+  static clang::SourceLocation getTombstoneKey() {
+    constexpr clang::SourceLocation::UIntTy Zero = 0;
+    return clang::SourceLocation::getFromRawEncoding(~Zero - 1);
+  }
 
-    static unsigned getHashValue(clang::SourceLocation Loc) {
-      return Loc.getHashValue();
-    }
+  static unsigned getHashValue(clang::SourceLocation Loc) {
+    return Loc.getHashValue();
+  }
 
-    static bool isEqual(clang::SourceLocation LHS, clang::SourceLocation RHS) {
-      return LHS == RHS;
-    }
-  };
+  static bool isEqual(clang::SourceLocation LHS, clang::SourceLocation RHS) {
+    return LHS == RHS;
+  }
+};
 
-  // Allow calling FoldingSetNodeID::Add with SourceLocation object as 
parameter
-  template <> struct FoldingSetTrait<clang::SourceLocation, void> {
-    static void Profile(const clang::SourceLocation &X, FoldingSetNodeID &ID);
-  };
+// Allow calling FoldingSetNodeID::Add with SourceLocation object as parameter
+template <> struct FoldingSetTrait<clang::SourceLocation, void> {
+  static void Profile(const clang::SourceLocation &X, FoldingSetNodeID &ID);
+};
 
-  template <> struct DenseMapInfo<clang::SourceRange> {
-    static clang::SourceRange getEmptyKey() {
-      return DenseMapInfo<clang::SourceLocation>::getEmptyKey();
-    }
+template <> struct DenseMapInfo<clang::SourceRange> {
+  static clang::SourceRange getEmptyKey() {
+    return DenseMapInfo<clang::SourceLocation>::getEmptyKey();
+  }
 
-    static clang::SourceRange getTombstoneKey() {
-      return DenseMapInfo<clang::SourceLocation>::getTombstoneKey();
-    }
+  static clang::SourceRange getTombstoneKey() {
+    return DenseMapInfo<clang::SourceLocation>::getTombstoneKey();
+  }
 
-    static unsigned getHashValue(clang::SourceRange Range) {
-      return detail::combineHashValue(Range.getBegin().getHashValue(),
-                                      Range.getEnd().getHashValue());
-    }
+  static unsigned getHashValue(clang::SourceRange Range) {
+    return detail::combineHashValue(Range.getBegin().getHashValue(),
+                                    Range.getEnd().getHashValue());
+  }
 
-    static bool isEqual(clang::SourceRange LHS, clang::SourceRange RHS) {
-      return LHS == RHS;
-    }
-  };
+  static bool isEqual(clang::SourceRange LHS, clang::SourceRange RHS) {
+    return LHS == RHS;
+  }
+};
 
 } // namespace llvm
 

>From 645ac26db1c0273b34901344d46ac552fa5e0cb8 Mon Sep 17 00:00:00 2001
From: Tobias Ribizel <[email protected]>
Date: Thu, 22 Jan 2026 17:42:14 +0100
Subject: [PATCH 2/5] [clang] improve documentation for SourceLocation and
 (Char)SourceRange

Clarify that SourceLocation always operates on a character level
(even if referring to tokens) and SourceRange is inclusive,
while CharSourceRange is exclusive usually.
---
 clang/include/clang/Basic/SourceLocation.h | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/clang/include/clang/Basic/SourceLocation.h 
b/clang/include/clang/Basic/SourceLocation.h
index aab021ad7b610..69fc69ebb946c 100644
--- a/clang/include/clang/Basic/SourceLocation.h
+++ b/clang/include/clang/Basic/SourceLocation.h
@@ -86,6 +86,10 @@ using FileIDAndOffset = std::pair<FileID, unsigned>;
 /// In addition, one bit of SourceLocation is used for quick access to the
 /// information whether the location is in a file or a macro expansion.
 ///
+/// SourceLocation operates on a character level, i.e. offsets describe
+/// character distances, but in most cases, they are used on a token level,
+/// where a SourceLocation points to the first character of a lexer token.
+///
 /// It is important that this type remains small. It is currently 32 bits wide.
 class SourceLocation {
   friend class ASTReader;
@@ -212,6 +216,11 @@ inline bool operator>=(const SourceLocation &LHS, const 
SourceLocation &RHS) {
 }
 
 /// A trivial tuple used to represent a source range.
+///
+/// SourceRange is an inclusive range [begin, end] that contains its endpoints,
+/// and when referring to tokens, its begin SourceLocation usually points to
+/// the first character of the first token and its end SourceLocation points to
+/// the last character of the last token.
 class SourceRange {
   SourceLocation B;
   SourceLocation E;
@@ -251,6 +260,15 @@ class SourceRange {
 /// last token of the range (a "token range").  In the token range case, the
 /// size of the last token must be measured to determine the actual end of the
 /// range.
+///
+/// CharSourceRange is interpreted differently depending on whether it is a
+/// TokenRange or a CharRange.
+/// For a TokenRange, the range contains the endpoint, i.e. the token 
containing
+/// the end SourceLocation.
+/// For a CharRange, the range doesn't contain the endpoint, i.e. it ends at 
the
+/// character before the end SourceLocation. This allows representing a point
+/// CharRange [begin, begin) that points at the empty range right in front of
+/// the begin SourceLocation.
 class CharSourceRange {
   SourceRange Range;
   bool IsTokenRange = false;

>From 0bad98f01fa54c21aea5cffd4640f4a3c9425923 Mon Sep 17 00:00:00 2001
From: Tobias Ribizel <[email protected]>
Date: Tue, 3 Feb 2026 19:43:36 +0100
Subject: [PATCH 3/5] clarify source location of end tokens

---
 clang/include/clang/Basic/SourceLocation.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Basic/SourceLocation.h 
b/clang/include/clang/Basic/SourceLocation.h
index 69fc69ebb946c..0afbeb0f9ba93 100644
--- a/clang/include/clang/Basic/SourceLocation.h
+++ b/clang/include/clang/Basic/SourceLocation.h
@@ -217,10 +217,10 @@ inline bool operator>=(const SourceLocation &LHS, const 
SourceLocation &RHS) {
 
 /// A trivial tuple used to represent a source range.
 ///
-/// SourceRange is an inclusive range [begin, end] that contains its endpoints,
-/// and when referring to tokens, its begin SourceLocation usually points to
-/// the first character of the first token and its end SourceLocation points to
-/// the last character of the last token.
+/// When referring to tokens, a SourceRange is an inclusive range [begin, end]
+/// that contains its endpoints, its begin SourceLocation points to the first
+/// character of the first token and its end SourceLocation points to the first
+/// character of the last token.
 class SourceRange {
   SourceLocation B;
   SourceLocation E;

>From 63daf12460949de82f80263bf20eedb274d8fffb Mon Sep 17 00:00:00 2001
From: Tobias Ribizel <[email protected]>
Date: Tue, 3 Feb 2026 20:45:52 +0100
Subject: [PATCH 4/5] clarify distinction between bytes and characters

---
 clang/include/clang/Basic/SourceLocation.h | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/clang/include/clang/Basic/SourceLocation.h 
b/clang/include/clang/Basic/SourceLocation.h
index 0afbeb0f9ba93..51afe7a083367 100644
--- a/clang/include/clang/Basic/SourceLocation.h
+++ b/clang/include/clang/Basic/SourceLocation.h
@@ -86,9 +86,9 @@ using FileIDAndOffset = std::pair<FileID, unsigned>;
 /// In addition, one bit of SourceLocation is used for quick access to the
 /// information whether the location is in a file or a macro expansion.
 ///
-/// SourceLocation operates on a character level, i.e. offsets describe
-/// character distances, but in most cases, they are used on a token level,
-/// where a SourceLocation points to the first character of a lexer token.
+/// SourceLocation operates on a byte level, i.e. offsets describe
+/// byte distances, but in most cases, they are used on a token level,
+/// where a SourceLocation points to the first byte of a lexer token.
 ///
 /// It is important that this type remains small. It is currently 32 bits wide.
 class SourceLocation {
@@ -219,8 +219,8 @@ inline bool operator>=(const SourceLocation &LHS, const 
SourceLocation &RHS) {
 ///
 /// When referring to tokens, a SourceRange is an inclusive range [begin, end]
 /// that contains its endpoints, its begin SourceLocation points to the first
-/// character of the first token and its end SourceLocation points to the first
-/// character of the last token.
+/// byte of the first token and its end SourceLocation points to the first byte
+/// of the last token.
 class SourceRange {
   SourceLocation B;
   SourceLocation E;
@@ -253,9 +253,9 @@ class SourceRange {
   void dump(const SourceManager &SM) const;
 };
 
-/// Represents a character-granular source range.
+/// Represents a byte-granular source range.
 ///
-/// The underlying SourceRange can either specify the starting/ending character
+/// The underlying SourceRange can either specify the starting/ending byte
 /// of the range, or it can specify the start of the range and the start of the
 /// last token of the range (a "token range").  In the token range case, the
 /// size of the last token must be measured to determine the actual end of the
@@ -266,7 +266,7 @@ class SourceRange {
 /// For a TokenRange, the range contains the endpoint, i.e. the token 
containing
 /// the end SourceLocation.
 /// For a CharRange, the range doesn't contain the endpoint, i.e. it ends at 
the
-/// character before the end SourceLocation. This allows representing a point
+/// byte before the end SourceLocation. This allows representing a point
 /// CharRange [begin, begin) that points at the empty range right in front of
 /// the begin SourceLocation.
 class CharSourceRange {
@@ -294,8 +294,8 @@ class CharSourceRange {
   }
 
   /// Return true if the end of this range specifies the start of
-  /// the last token.  Return false if the end of this range specifies the last
-  /// character in the range.
+  /// the last token.  Return false if the end of this range specifies the 
first
+  /// byte after the range.
   bool isTokenRange() const { return IsTokenRange; }
   bool isCharRange() const { return !IsTokenRange; }
 

>From efff2c756df13fecd0052266b626eac9d09c3174 Mon Sep 17 00:00:00 2001
From: Tobias Ribizel <[email protected]>
Date: Tue, 3 Feb 2026 20:46:51 +0100
Subject: [PATCH 5/5] Revert "[clang] format SourceLocation.h"

This reverts commit 9615e09e8a61a564c2fbaa31967f505590c6beaa.
---
 clang/include/clang/Basic/SourceLocation.h | 133 +++++++++++----------
 1 file changed, 72 insertions(+), 61 deletions(-)

diff --git a/clang/include/clang/Basic/SourceLocation.h 
b/clang/include/clang/Basic/SourceLocation.h
index 51afe7a083367..b73b43d953662 100644
--- a/clang/include/clang/Basic/SourceLocation.h
+++ b/clang/include/clang/Basic/SourceLocation.h
@@ -108,7 +108,7 @@ class SourceLocation {
   enum : UIntTy { MacroIDBit = 1ULL << (8 * sizeof(UIntTy) - 1) };
 
 public:
-  bool isFileID() const { return (ID & MacroIDBit) == 0; }
+  bool isFileID() const  { return (ID & MacroIDBit) == 0; }
   bool isMacroID() const { return (ID & MacroIDBit) != 0; }
 
   /// Return true if this is a valid SourceLocation object.
@@ -141,9 +141,9 @@ class SourceLocation {
   /// Return a source location with the specified offset from this
   /// SourceLocation.
   SourceLocation getLocWithOffset(IntTy Offset) const {
-    assert(((getOffset() + Offset) & MacroIDBit) == 0 && "offset overflow");
+    assert(((getOffset()+Offset) & MacroIDBit) == 0 && "offset overflow");
     SourceLocation L;
-    L.ID = ID + Offset;
+    L.ID = ID+Offset;
     return L;
   }
 
@@ -169,10 +169,10 @@ class SourceLocation {
   ///
   /// This should only be passed to SourceLocation::getFromPtrEncoding, it
   /// should not be inspected directly.
-  void *getPtrEncoding() const {
+  void* getPtrEncoding() const {
     // Double cast to avoid a warning "cast to pointer from integer of 
different
     // size".
-    return (void *)(uintptr_t)getRawEncoding();
+    return (void*)(uintptr_t)getRawEncoding();
   }
 
   /// Turn a pointer encoding of a SourceLocation object back
@@ -239,9 +239,13 @@ class SourceRange {
   bool isValid() const { return B.isValid() && E.isValid(); }
   bool isInvalid() const { return !isValid(); }
 
-  bool operator==(const SourceRange &X) const { return B == X.B && E == X.E; }
+  bool operator==(const SourceRange &X) const {
+    return B == X.B && E == X.E;
+  }
 
-  bool operator!=(const SourceRange &X) const { return B != X.B || E != X.E; }
+  bool operator!=(const SourceRange &X) const {
+    return B != X.B || E != X.E;
+  }
 
   // Returns true iff other is wholly contained within this range.
   bool fullyContains(const SourceRange &other) const {
@@ -460,7 +464,7 @@ class FullSourceLoc : public SourceLocation {
 
   /// Comparison function class, useful for sorting FullSourceLocs.
   struct BeforeThanCompare {
-    bool operator()(const FullSourceLoc &lhs, const FullSourceLoc &rhs) const {
+    bool operator()(const FullSourceLoc& lhs, const FullSourceLoc& rhs) const {
       return lhs.isBeforeInTranslationUnitThan(rhs);
     }
   };
@@ -470,12 +474,14 @@ class FullSourceLoc : public SourceLocation {
   /// This is useful for debugging.
   void dump() const;
 
-  friend bool operator==(const FullSourceLoc &LHS, const FullSourceLoc &RHS) {
+  friend bool
+  operator==(const FullSourceLoc &LHS, const FullSourceLoc &RHS) {
     return LHS.getRawEncoding() == RHS.getRawEncoding() &&
-           LHS.SrcMgr == RHS.SrcMgr;
+          LHS.SrcMgr == RHS.SrcMgr;
   }
 
-  friend bool operator!=(const FullSourceLoc &LHS, const FullSourceLoc &RHS) {
+  friend bool
+  operator!=(const FullSourceLoc &LHS, const FullSourceLoc &RHS) {
     return !(LHS == RHS);
   }
 };
@@ -484,68 +490,73 @@ class FullSourceLoc : public SourceLocation {
 
 namespace llvm {
 
-/// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
-/// DenseSets.
-template <> struct DenseMapInfo<clang::FileID, void> {
-  static clang::FileID getEmptyKey() { return {}; }
+  /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
+  /// DenseSets.
+  template <>
+  struct DenseMapInfo<clang::FileID, void> {
+    static clang::FileID getEmptyKey() {
+      return {};
+    }
 
-  static clang::FileID getTombstoneKey() {
-    return clang::FileID::getSentinel();
-  }
+    static clang::FileID getTombstoneKey() {
+      return clang::FileID::getSentinel();
+    }
 
-  static unsigned getHashValue(clang::FileID S) { return S.getHashValue(); }
+    static unsigned getHashValue(clang::FileID S) {
+      return S.getHashValue();
+    }
 
-  static bool isEqual(clang::FileID LHS, clang::FileID RHS) {
-    return LHS == RHS;
-  }
-};
+    static bool isEqual(clang::FileID LHS, clang::FileID RHS) {
+      return LHS == RHS;
+    }
+  };
 
-/// Define DenseMapInfo so that SourceLocation's can be used as keys in
-/// DenseMap and DenseSet. This trait class is eqivalent to
-/// DenseMapInfo<unsigned> which uses SourceLocation::ID is used as a key.
-template <> struct DenseMapInfo<clang::SourceLocation, void> {
-  static clang::SourceLocation getEmptyKey() {
-    constexpr clang::SourceLocation::UIntTy Zero = 0;
-    return clang::SourceLocation::getFromRawEncoding(~Zero);
-  }
+  /// Define DenseMapInfo so that SourceLocation's can be used as keys in
+  /// DenseMap and DenseSet. This trait class is eqivalent to
+  /// DenseMapInfo<unsigned> which uses SourceLocation::ID is used as a key.
+  template <> struct DenseMapInfo<clang::SourceLocation, void> {
+    static clang::SourceLocation getEmptyKey() {
+      constexpr clang::SourceLocation::UIntTy Zero = 0;
+      return clang::SourceLocation::getFromRawEncoding(~Zero);
+    }
 
-  static clang::SourceLocation getTombstoneKey() {
-    constexpr clang::SourceLocation::UIntTy Zero = 0;
-    return clang::SourceLocation::getFromRawEncoding(~Zero - 1);
-  }
+    static clang::SourceLocation getTombstoneKey() {
+      constexpr clang::SourceLocation::UIntTy Zero = 0;
+      return clang::SourceLocation::getFromRawEncoding(~Zero - 1);
+    }
 
-  static unsigned getHashValue(clang::SourceLocation Loc) {
-    return Loc.getHashValue();
-  }
+    static unsigned getHashValue(clang::SourceLocation Loc) {
+      return Loc.getHashValue();
+    }
 
-  static bool isEqual(clang::SourceLocation LHS, clang::SourceLocation RHS) {
-    return LHS == RHS;
-  }
-};
+    static bool isEqual(clang::SourceLocation LHS, clang::SourceLocation RHS) {
+      return LHS == RHS;
+    }
+  };
 
-// Allow calling FoldingSetNodeID::Add with SourceLocation object as parameter
-template <> struct FoldingSetTrait<clang::SourceLocation, void> {
-  static void Profile(const clang::SourceLocation &X, FoldingSetNodeID &ID);
-};
+  // Allow calling FoldingSetNodeID::Add with SourceLocation object as 
parameter
+  template <> struct FoldingSetTrait<clang::SourceLocation, void> {
+    static void Profile(const clang::SourceLocation &X, FoldingSetNodeID &ID);
+  };
 
-template <> struct DenseMapInfo<clang::SourceRange> {
-  static clang::SourceRange getEmptyKey() {
-    return DenseMapInfo<clang::SourceLocation>::getEmptyKey();
-  }
+  template <> struct DenseMapInfo<clang::SourceRange> {
+    static clang::SourceRange getEmptyKey() {
+      return DenseMapInfo<clang::SourceLocation>::getEmptyKey();
+    }
 
-  static clang::SourceRange getTombstoneKey() {
-    return DenseMapInfo<clang::SourceLocation>::getTombstoneKey();
-  }
+    static clang::SourceRange getTombstoneKey() {
+      return DenseMapInfo<clang::SourceLocation>::getTombstoneKey();
+    }
 
-  static unsigned getHashValue(clang::SourceRange Range) {
-    return detail::combineHashValue(Range.getBegin().getHashValue(),
-                                    Range.getEnd().getHashValue());
-  }
+    static unsigned getHashValue(clang::SourceRange Range) {
+      return detail::combineHashValue(Range.getBegin().getHashValue(),
+                                      Range.getEnd().getHashValue());
+    }
 
-  static bool isEqual(clang::SourceRange LHS, clang::SourceRange RHS) {
-    return LHS == RHS;
-  }
-};
+    static bool isEqual(clang::SourceRange LHS, clang::SourceRange RHS) {
+      return LHS == RHS;
+    }
+  };
 
 } // namespace llvm
 

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to