diff --git a/src/gn/c_include_iterator.cc b/src/gn/c_include_iterator.cc
index faf475d..e4cd7d4 100644
--- a/src/gn/c_include_iterator.cc
+++ b/src/gn/c_include_iterator.cc
@@ -139,11 +139,9 @@
     if (type != INCLUDE_NONE) {
       include->contents = include_contents;
       include->location = LocationRange(
-          Location(input_file_, cur_line_number, begin_char,
-                   -1 /* TODO(scottmg): Is this important? */),
+          Location(input_file_, cur_line_number, begin_char),
           Location(input_file_, cur_line_number,
-                   begin_char + static_cast<int>(include_contents.size()),
-                   -1 /* TODO(scottmg): Is this important? */));
+                   begin_char + static_cast<int>(include_contents.size())));
       include->system_style_include = (type == INCLUDE_SYSTEM);
 
       lines_since_last_include_ = 0;
diff --git a/src/gn/header_checker.cc b/src/gn/header_checker.cc
index 32f4d90..8d2d313 100644
--- a/src/gn/header_checker.cc
+++ b/src/gn/header_checker.cc
@@ -47,11 +47,10 @@
       input_file.name(), &clone_input_file, &tokens, &parse_root);
   clone_input_file->SetContents(input_file.contents());
 
-  return LocationRange(
-      Location(clone_input_file, range.begin().line_number(),
-               range.begin().column_number(), -1 /* TODO(scottmg) */),
-      Location(clone_input_file, range.end().line_number(),
-               range.end().column_number(), -1 /* TODO(scottmg) */));
+  return LocationRange(Location(clone_input_file, range.begin().line_number(),
+                                range.begin().column_number()),
+                       Location(clone_input_file, range.end().line_number(),
+                                range.end().column_number()));
 }
 
 // Given a reverse dependency chain where the target chain[0]'s includes are
diff --git a/src/gn/location.cc b/src/gn/location.cc
index 95bdd13..cba44c8 100644
--- a/src/gn/location.cc
+++ b/src/gn/location.cc
@@ -12,18 +12,12 @@
 
 Location::Location() = default;
 
-Location::Location(const InputFile* file,
-                   int line_number,
-                   int column_number,
-                   int byte)
-    : file_(file),
-      line_number_(line_number),
-      column_number_(column_number),
-      byte_(byte) {}
+Location::Location(const InputFile* file, int line_number, int column_number)
+    : file_(file), line_number_(line_number), column_number_(column_number) {}
 
 bool Location::operator==(const Location& other) const {
-  return other.file_ == file_ && other.line_number_ == line_number_ &&
-         other.column_number_ == column_number_;
+  return (file_ == other.file_ && line_number_ == other.line_number_ &&
+          column_number_ == other.column_number_);
 }
 
 bool Location::operator!=(const Location& other) const {
@@ -36,6 +30,12 @@
          std::tie(other.line_number_, other.column_number_);
 }
 
+bool Location::operator<=(const Location& other) const {
+  DCHECK(file_ == other.file_);
+  return std::tie(line_number_, column_number_) <=
+         std::tie(other.line_number_, other.column_number_);
+}
+
 std::string Location::Describe(bool include_column_number) const {
   if (!file_)
     return std::string();
diff --git a/src/gn/location.h b/src/gn/location.h
index 471391b..79af5dd 100644
--- a/src/gn/location.h
+++ b/src/gn/location.h
@@ -13,17 +13,19 @@
 class Location {
  public:
   Location();
-  Location(const InputFile* file, int line_number, int column_number, int byte);
+  Location(const InputFile* file, int line_number, int column_number);
 
   const InputFile* file() const { return file_; }
   int line_number() const { return line_number_; }
   int column_number() const { return column_number_; }
-  int byte() const { return byte_; }
   bool is_null() const { return *this == Location(); }
 
   bool operator==(const Location& other) const;
   bool operator!=(const Location& other) const;
   bool operator<(const Location& other) const;
+  bool operator<=(const Location& other) const;
+  bool operator>(const Location& other) const { return !(*this <= other); }
+  bool operator>=(const Location& other) const { return !(*this < other); }
 
   // Returns a string with the file, line, and (optionally) the character
   // offset for this location. If this location is null, returns an empty
@@ -34,7 +36,6 @@
   const InputFile* file_ = nullptr;  // Null when unset.
   int line_number_ = -1;             // -1 when unset. 1-based.
   int column_number_ = -1;           // -1 when unset. 1-based.
-  int byte_ = 0;                     // Index into the buffer, 0-based.
 };
 
 // Represents a range in a source file. Used for error reporting.
diff --git a/src/gn/parse_tree.cc b/src/gn/parse_tree.cc
index 83452d0..e9ca8fa 100644
--- a/src/gn/parse_tree.cc
+++ b/src/gn/parse_tree.cc
@@ -111,7 +111,7 @@
       value.FindKey(kJsonLocation)->FindKey(kJsonLocationBeginLine)->GetInt();
   int column =
       value.FindKey(kJsonLocation)->FindKey(kJsonLocationBeginColumn)->GetInt();
-  return Location(nullptr, line, column, 0);
+  return Location(nullptr, line, column);
 }
 
 void GetCommentsFromJSON(ParseNode* node, const base::Value& value) {
@@ -120,7 +120,7 @@
   Location loc = GetBeginLocationFromJSON(value);
 
   auto loc_for = [&loc](int line) {
-    return Location(nullptr, loc.line_number() + line, loc.column_number(), 0);
+    return Location(nullptr, loc.line_number() + line, loc.column_number());
   };
 
   if (value.FindKey(kJsonBeforeComment)) {
@@ -443,8 +443,7 @@
 
 void AccessorNode::SetNewLocation(int line_number) {
   Location old = base_.location();
-  base_.set_location(
-      Location(old.file(), line_number, old.column_number(), old.byte()));
+  base_.set_location(Location(old.file(), line_number, old.column_number()));
 }
 
 bool AccessorNode::ComputeAndValidateListIndex(Scope* scope,
@@ -782,14 +781,12 @@
 void FunctionCallNode::SetNewLocation(int line_number) {
   Location func_old_loc = function_.location();
   Location func_new_loc =
-      Location(func_old_loc.file(), line_number, func_old_loc.column_number(),
-               func_old_loc.byte());
+      Location(func_old_loc.file(), line_number, func_old_loc.column_number());
   function_.set_location(func_new_loc);
 
   Location args_old_loc = args_->Begin().location();
   Location args_new_loc =
-      Location(args_old_loc.file(), line_number, args_old_loc.column_number(),
-               args_old_loc.byte());
+      Location(args_old_loc.file(), line_number, args_old_loc.column_number());
   const_cast<Token&>(args_->Begin()).set_location(args_new_loc);
   const_cast<Token&>(args_->End()->value()).set_location(args_new_loc);
 }
@@ -848,8 +845,7 @@
 
 void IdentifierNode::SetNewLocation(int line_number) {
   Location old = value_.location();
-  value_.set_location(
-      Location(old.file(), line_number, old.column_number(), old.byte()));
+  value_.set_location(Location(old.file(), line_number, old.column_number()));
 }
 
 // ListNode -------------------------------------------------------------------
@@ -1135,8 +1131,7 @@
 
 void LiteralNode::SetNewLocation(int line_number) {
   Location old = value_.location();
-  value_.set_location(
-      Location(old.file(), line_number, old.column_number(), old.byte()));
+  value_.set_location(Location(old.file(), line_number, old.column_number()));
 }
 
 // UnaryOpNode ----------------------------------------------------------------
diff --git a/src/gn/parse_tree_unittest.cc b/src/gn/parse_tree_unittest.cc
index ed28b54..cc49848 100644
--- a/src/gn/parse_tree_unittest.cc
+++ b/src/gn/parse_tree_unittest.cc
@@ -20,8 +20,8 @@
   // Make a pretend parse node with proper tracking that we can blame for the
   // given value.
   InputFile input_file(SourceFile("//foo"));
-  Token base_token(Location(&input_file, 1, 1, 1), Token::IDENTIFIER, "a");
-  Token member_token(Location(&input_file, 1, 1, 1), Token::IDENTIFIER, "b");
+  Token base_token(Location(&input_file, 1, 1), Token::IDENTIFIER, "a");
+  Token member_token(Location(&input_file, 1, 1), Token::IDENTIFIER, "b");
 
   AccessorNode accessor;
   accessor.set_base(base_token);
diff --git a/src/gn/parser.cc b/src/gn/parser.cc
index 07e9ba3..dbc3d62 100644
--- a/src/gn/parser.cc
+++ b/src/gn/parser.cc
@@ -833,7 +833,7 @@
     }
     const Location start = node->GetRange().begin();
     while (cur_comment < static_cast<int>(line_comment_tokens_.size())) {
-      if (start.byte() >= line_comment_tokens_[cur_comment].location().byte()) {
+      if (start >= line_comment_tokens_[cur_comment].location()) {
         const_cast<ParseNode*>(node)->comments_mutable()->append_before(
             line_comment_tokens_[cur_comment]);
         ++cur_comment;
@@ -871,7 +871,7 @@
       continue;
 
     while (cur_comment >= 0) {
-      if (end.byte() <= suffix_comment_tokens_[cur_comment].location().byte()) {
+      if (end <= suffix_comment_tokens_[cur_comment].location()) {
         const_cast<ParseNode*>(*i)->comments_mutable()->append_suffix(
             suffix_comment_tokens_[cur_comment]);
         --cur_comment;
diff --git a/src/gn/scope_unittest.cc b/src/gn/scope_unittest.cc
index af39a9d..9f82685 100644
--- a/src/gn/scope_unittest.cc
+++ b/src/gn/scope_unittest.cc
@@ -49,7 +49,7 @@
   // Make a pretend parse node with proper tracking that we can blame for the
   // given value.
   InputFile input_file(SourceFile("//foo"));
-  Token assignment_token(Location(&input_file, 1, 1, 1), Token::STRING,
+  Token assignment_token(Location(&input_file, 1, 1), Token::STRING,
                          "\"hello\"");
   LiteralNode assignment;
   assignment.set_value(assignment_token);
@@ -237,7 +237,7 @@
   // Make a pretend parse node with proper tracking that we can blame for the
   // given value.
   InputFile input_file(SourceFile("//foo"));
-  Token assignment_token(Location(&input_file, 1, 1, 1), Token::STRING,
+  Token assignment_token(Location(&input_file, 1, 1), Token::STRING,
                          "\"hello\"");
   LiteralNode assignment;
   assignment.set_value(assignment_token);
@@ -272,7 +272,7 @@
   // Make a pretend parse node with proper tracking that we can blame for the
   // given value.
   InputFile input_file(SourceFile("//foo"));
-  Token assignment_token(Location(&input_file, 1, 1, 1), Token::STRING,
+  Token assignment_token(Location(&input_file, 1, 1), Token::STRING,
                          "\"hello\"");
   LiteralNode assignment;
   assignment.set_value(assignment_token);
diff --git a/src/gn/string_utils.cc b/src/gn/string_utils.cc
index bff9e8f..bf8f8ba 100644
--- a/src/gn/string_utils.cc
+++ b/src/gn/string_utils.cc
@@ -28,13 +28,10 @@
   // The "+1" is skipping over the " at the beginning of the token.
   int int_offset = static_cast<int>(offset);
   Location begin_loc(token.location().file(), token.location().line_number(),
-                     token.location().column_number() + int_offset + 1,
-                     token.location().byte() + int_offset + 1);
-  Location end_loc(
-      token.location().file(), token.location().line_number(),
-      token.location().column_number() + int_offset + 1 +
-          static_cast<int>(size),
-      token.location().byte() + int_offset + 1 + static_cast<int>(size));
+                     token.location().column_number() + int_offset + 1);
+  Location end_loc(token.location().file(), token.location().line_number(),
+                   token.location().column_number() + int_offset + 1 +
+                       static_cast<int>(size));
   return Err(LocationRange(begin_loc, end_loc), msg, help);
 }
 
diff --git a/src/gn/token.h b/src/gn/token.h
index 6a90872..9a2cfca 100644
--- a/src/gn/token.h
+++ b/src/gn/token.h
@@ -70,8 +70,7 @@
     return LocationRange(
         location_,
         Location(location_.file(), location_.line_number(),
-                 location_.column_number() + static_cast<int>(value_.size()),
-                 location_.byte() + static_cast<int>(value_.size())));
+                 location_.column_number() + static_cast<int>(value_.size())));
   }
 
   // Helper functions for comparing this token to something.
diff --git a/src/gn/tokenizer.cc b/src/gn/tokenizer.cc
index a2f0034..b68be3c 100644
--- a/src/gn/tokenizer.cc
+++ b/src/gn/tokenizer.cc
@@ -389,8 +389,7 @@
 }
 
 Location Tokenizer::GetCurrentLocation() const {
-  return Location(input_file_, line_number_, column_number_,
-                  static_cast<int>(cur_));
+  return Location(input_file_, line_number_, column_number_);
 }
 
 Err Tokenizer::GetErrorForInvalidToken(const Location& location) const {
diff --git a/src/gn/tokenizer_unittest.cc b/src/gn/tokenizer_unittest.cc
index d740d86..e3e0542 100644
--- a/src/gn/tokenizer_unittest.cc
+++ b/src/gn/tokenizer_unittest.cc
@@ -127,10 +127,10 @@
   std::vector<Token> results = Tokenizer::Tokenize(&input, &err);
 
   ASSERT_EQ(4u, results.size());
-  ASSERT_TRUE(results[0].location() == Location(&input, 1, 1, 1));
-  ASSERT_TRUE(results[1].location() == Location(&input, 1, 3, 3));
-  ASSERT_TRUE(results[2].location() == Location(&input, 1, 5, 5));
-  ASSERT_TRUE(results[3].location() == Location(&input, 2, 3, 8));
+  ASSERT_TRUE(results[0].location() == Location(&input, 1, 1));
+  ASSERT_TRUE(results[1].location() == Location(&input, 1, 3));
+  ASSERT_TRUE(results[2].location() == Location(&input, 1, 5));
+  ASSERT_TRUE(results[3].location() == Location(&input, 2, 3));
 }
 
 TEST(Tokenizer, ByteOffsetOfNthLine) {
