diff --git a/src/gn/analyzer.cc b/src/gn/analyzer.cc
index 7bb200c..69fbe7d 100644
--- a/src/gn/analyzer.cc
+++ b/src/gn/analyzer.cc
@@ -47,16 +47,15 @@
   std::set<Label> invalid_labels;
 };
 
-std::set<Label> LabelsFor(const std::set<const Target*>& targets) {
+std::set<Label> LabelsFor(const TargetSet& targets) {
   std::set<Label> labels;
   for (auto* target : targets)
     labels.insert(target->label());
   return labels;
 }
 
-std::set<const Target*> Intersect(const std::set<const Target*>& l,
-                                  const std::set<const Target*>& r) {
-  std::set<const Target*> result;
+TargetSet Intersect(const TargetSet& l, const TargetSet& r) {
+  TargetSet result;
   std::set_intersection(l.begin(), l.end(), r.begin(), r.end(),
                         std::inserter(result, result.begin()));
   return result;
@@ -316,7 +315,7 @@
 
   std::set<const Item*> affected_items =
       GetAllAffectedItems(inputs.source_files);
-  std::set<const Target*> affected_targets;
+  TargetSet affected_targets;
   for (const Item* affected_item : affected_items) {
     if (affected_item->AsTarget())
       affected_targets.insert(affected_item->AsTarget());
@@ -327,18 +326,18 @@
     return OutputsToJSON(outputs, default_toolchain_, err);
   }
 
-  std::set<const Target*> root_targets;
+  TargetSet root_targets;
   for (const auto* item : all_items_) {
     if (item->AsTarget() && dep_map_.find(item) == dep_map_.end())
       root_targets.insert(item->AsTarget());
   }
 
-  std::set<const Target*> compile_targets = TargetsFor(inputs.compile_labels);
+  TargetSet compile_targets = TargetsFor(inputs.compile_labels);
   if (inputs.compile_included_all) {
     for (auto* root_target : root_targets)
       compile_targets.insert(root_target);
   }
-  std::set<const Target*> filtered_targets = Filter(compile_targets);
+  TargetSet filtered_targets = Filter(compile_targets);
   outputs.compile_labels =
       LabelsFor(Intersect(filtered_targets, affected_targets));
 
@@ -348,7 +347,7 @@
       outputs.compile_labels.size() == filtered_targets.size())
     outputs.compile_includes_all = true;
 
-  std::set<const Target*> test_targets = TargetsFor(inputs.test_labels);
+  TargetSet test_targets = TargetsFor(inputs.test_labels);
   outputs.test_labels = LabelsFor(Intersect(test_targets, affected_targets));
 
   if (outputs.compile_labels.empty() && outputs.test_labels.empty())
@@ -380,9 +379,8 @@
   return invalid_labels;
 }
 
-std::set<const Target*> Analyzer::TargetsFor(
-    const std::set<Label>& labels) const {
-  std::set<const Target*> targets;
+TargetSet Analyzer::TargetsFor(const std::set<Label>& labels) const {
+  TargetSet targets;
   for (const auto& label : labels) {
     auto it = labels_to_items_.find(label);
     if (it != labels_to_items_.end()) {
@@ -393,18 +391,17 @@
   return targets;
 }
 
-std::set<const Target*> Analyzer::Filter(
-    const std::set<const Target*>& targets) const {
-  std::set<const Target*> seen;
-  std::set<const Target*> filtered;
+TargetSet Analyzer::Filter(const TargetSet& targets) const {
+  TargetSet seen;
+  TargetSet filtered;
   for (const auto* target : targets)
     FilterTarget(target, &seen, &filtered);
   return filtered;
 }
 
 void Analyzer::FilterTarget(const Target* target,
-                            std::set<const Target*>* seen,
-                            std::set<const Target*>* filtered) const {
+                            TargetSet* seen,
+                            TargetSet* filtered) const {
   if (seen->find(target) == seen->end()) {
     seen->insert(target);
     if (target->output_type() != Target::GROUP) {
diff --git a/src/gn/analyzer.h b/src/gn/analyzer.h
index 2ffdb52..77aed2a 100644
--- a/src/gn/analyzer.h
+++ b/src/gn/analyzer.h
@@ -13,6 +13,7 @@
 #include "gn/item.h"
 #include "gn/label.h"
 #include "gn/source_file.h"
+#include "gn/target.h"
 
 // An Analyzer can answer questions about a build graph. It is used
 // to answer queries for the `refs` and `analyze` commands, where we
@@ -44,7 +45,7 @@
 
   // Returns the set of all targets that have a label in the given set.
   // Invalid (or missing) labels will be ignored.
-  std::set<const Target*> TargetsFor(const std::set<Label>& labels) const;
+  TargetSet TargetsFor(const std::set<Label>& labels) const;
 
   // Returns a filtered set of the given targets, meaning that for each of the
   // given targets,
@@ -66,13 +67,11 @@
   // ones).
   //
   // This filtering behavior is also known as "pruning" the list of targets.
-  std::set<const Target*> Filter(const std::set<const Target*>& targets) const;
+  TargetSet Filter(const TargetSet& targets) const;
 
   // Filter an individual target and adds the results to filtered
   // (see Filter(), above).
-  void FilterTarget(const Target*,
-                    std::set<const Target*>* seen,
-                    std::set<const Target*>* filtered) const;
+  void FilterTarget(const Target*, TargetSet* seen, TargetSet* filtered) const;
 
   bool ItemRefersToFile(const Item* item, const SourceFile* file) const;
 
diff --git a/src/gn/command_meta.cc b/src/gn/command_meta.cc
index 6ee5fe2..27897e2 100644
--- a/src/gn/command_meta.cc
+++ b/src/gn/command_meta.cc
@@ -113,7 +113,7 @@
   std::vector<std::string> walk_keys = base::SplitString(
       walk_keys_str, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
   Err err;
-  std::set<const Target*> targets_walked;
+  TargetSet targets_walked;
   SourceDir rebase_source_dir(rebase_dir);
   // When SourceDir constructor is supplied with an empty string,
   // a trailing slash will be added. This prevent SourceDir::is_null()
diff --git a/src/gn/command_path.cc b/src/gn/command_path.cc
index a82c90d..b9ed780 100644
--- a/src/gn/command_path.cc
+++ b/src/gn/command_path.cc
@@ -179,7 +179,7 @@
   work_queue.push_back(initial_stack);
 
   // Track checked targets to avoid checking the same once more than once.
-  std::set<const Target*> visited;
+  TargetSet visited;
 
   while (!work_queue.empty()) {
     PathVector current_path = work_queue.front();
diff --git a/src/gn/command_refs.cc b/src/gn/command_refs.cc
index dc27f56..7fcdb26 100644
--- a/src/gn/command_refs.cc
+++ b/src/gn/command_refs.cc
@@ -26,7 +26,7 @@
 
 namespace {
 
-using TargetSet = std::set<const Target*>;
+using TargetSet = TargetSet;
 using TargetVector = std::vector<const Target*>;
 
 // Maps targets to the list of targets that depend on them.
diff --git a/src/gn/commands.cc b/src/gn/commands.cc
index da6514b..24a16b1 100644
--- a/src/gn/commands.cc
+++ b/src/gn/commands.cc
@@ -612,14 +612,12 @@
   }
 }
 
-void FilterAndPrintTargetSet(bool indent,
-                             const std::set<const Target*>& targets) {
+void FilterAndPrintTargetSet(bool indent, const TargetSet& targets) {
   std::vector<const Target*> target_vector(targets.begin(), targets.end());
   FilterAndPrintTargets(indent, &target_vector);
 }
 
-void FilterAndPrintTargetSet(const std::set<const Target*>& targets,
-                             base::ListValue* out) {
+void FilterAndPrintTargetSet(const TargetSet& targets, base::ListValue* out) {
   std::vector<const Target*> target_vector(targets.begin(), targets.end());
   FilterAndPrintTargets(&target_vector, out);
 }
diff --git a/src/gn/commands.h b/src/gn/commands.h
index 54a1a9d..4824b79 100644
--- a/src/gn/commands.h
+++ b/src/gn/commands.h
@@ -217,10 +217,8 @@
 void FilterAndPrintTargets(std::vector<const Target*>* targets,
                            base::ListValue* out);
 
-void FilterAndPrintTargetSet(bool indent,
-                             const std::set<const Target*>& targets);
-void FilterAndPrintTargetSet(const std::set<const Target*>& targets,
-                             base::ListValue* out);
+void FilterAndPrintTargetSet(bool indent, const TargetSet& targets);
+void FilterAndPrintTargetSet(const TargetSet& targets, base::ListValue* out);
 
 // Computes which targets reference the given file and also stores how the
 // target references the file.
diff --git a/src/gn/compile_commands_writer.cc b/src/gn/compile_commands_writer.cc
index c0b94d1..1aa2d1a 100644
--- a/src/gn/compile_commands_writer.cc
+++ b/src/gn/compile_commands_writer.cc
@@ -338,7 +338,7 @@
     const std::set<std::string>& target_filters_set) {
   std::vector<const Target*> preserved_targets;
 
-  std::set<const Target*> visited;
+  TargetSet visited;
   for (auto& target : all_targets) {
     if (target_filters_set.count(target->label().name())) {
       VisitDeps(target, &visited);
@@ -357,7 +357,7 @@
 }
 
 void CompileCommandsWriter::VisitDeps(const Target* target,
-                                      std::set<const Target*>* visited) {
+                                      TargetSet* visited) {
   if (!visited->count(target)) {
     visited->insert(target);
     for (const auto& pair : target->GetDeps(Target::DEPS_ALL)) {
diff --git a/src/gn/compile_commands_writer.h b/src/gn/compile_commands_writer.h
index adc2986..03006c8 100644
--- a/src/gn/compile_commands_writer.h
+++ b/src/gn/compile_commands_writer.h
@@ -36,7 +36,7 @@
 
  private:
   // This function visits the deps graph of a target in a DFS fashion.
-  static void VisitDeps(const Target* target, std::set<const Target*>* visited);
+  static void VisitDeps(const Target* target, TargetSet* visited);
 };
 
 #endif  // TOOLS_GN_COMPILE_COMMANDS_WRITER_H_
diff --git a/src/gn/desc_builder.cc b/src/gn/desc_builder.cc
index bcd30f3..957fde0 100644
--- a/src/gn/desc_builder.cc
+++ b/src/gn/desc_builder.cc
@@ -97,11 +97,9 @@
   return dir.value();
 }
 
-void RecursiveCollectChildDeps(const Target* target,
-                               std::set<const Target*>* result);
+void RecursiveCollectChildDeps(const Target* target, TargetSet* result);
 
-void RecursiveCollectDeps(const Target* target,
-                          std::set<const Target*>* result) {
+void RecursiveCollectDeps(const Target* target, TargetSet* result) {
   if (result->find(target) != result->end())
     return;  // Already did this target.
   result->insert(target);
@@ -109,8 +107,7 @@
   RecursiveCollectChildDeps(target, result);
 }
 
-void RecursiveCollectChildDeps(const Target* target,
-                               std::set<const Target*>* result) {
+void RecursiveCollectChildDeps(const Target* target, TargetSet* result) {
   for (const auto& pair : target->GetDeps(Target::DEPS_ALL))
     RecursiveCollectDeps(pair.ptr, result);
 }
@@ -646,7 +643,7 @@
   // set is null, all dependencies will be printed.
   void RecursivePrintDeps(base::ListValue* out,
                           const Target* target,
-                          std::set<const Target*>* seen_targets,
+                          TargetSet* seen_targets,
                           int indent_level) {
     // Combine all deps into one sorted list.
     std::vector<LabelTargetPair> sorted_deps;
@@ -694,7 +691,7 @@
         RecursivePrintDeps(res.get(), target_, nullptr, 0);
       } else {
         // Don't recurse into duplicates.
-        std::set<const Target*> seen_targets;
+        TargetSet seen_targets;
         RecursivePrintDeps(res.get(), target_, &seen_targets, 0);
       }
     } else {  // not tree
@@ -702,7 +699,7 @@
       // Collect the deps to display.
       if (all_) {
         // Show all dependencies.
-        std::set<const Target*> all_deps;
+        TargetSet all_deps;
         RecursiveCollectChildDeps(target_, &all_deps);
         commands::FilterAndPrintTargetSet(all_deps, res.get());
       } else {
diff --git a/src/gn/json_project_writer.cc b/src/gn/json_project_writer.cc
index a8aad90..f5f7f5a 100644
--- a/src/gn/json_project_writer.cc
+++ b/src/gn/json_project_writer.cc
@@ -43,8 +43,7 @@
 
 namespace {
 
-void AddTargetDependencies(const Target* target,
-                           std::set<const Target*>* deps) {
+void AddTargetDependencies(const Target* target, TargetSet* deps) {
   for (const auto& pair : target->GetDeps(Target::DEPS_LINKED)) {
     if (deps->find(pair.ptr) == deps->end()) {
       deps->insert(pair.ptr);
@@ -71,7 +70,7 @@
     }
     commands::FilterTargetsByPatterns(all_targets, filters, targets);
 
-    std::set<const Target*> target_set(targets->begin(), targets->end());
+    TargetSet target_set(targets->begin(), targets->end());
     for (const auto* target : *targets)
       AddTargetDependencies(target, &target_set);
 
diff --git a/src/gn/metadata_walk.cc b/src/gn/metadata_walk.cc
index 19011cf..bb2675e 100644
--- a/src/gn/metadata_walk.cc
+++ b/src/gn/metadata_walk.cc
@@ -9,7 +9,7 @@
     const std::vector<std::string>& keys_to_extract,
     const std::vector<std::string>& keys_to_walk,
     const SourceDir& rebase_dir,
-    std::set<const Target*>* targets_walked,
+    TargetSet* targets_walked,
     Err* err) {
   std::vector<Value> result;
   for (const auto* target : targets_to_walk) {
diff --git a/src/gn/metadata_walk.h b/src/gn/metadata_walk.h
index 011ed07..2b659d6 100644
--- a/src/gn/metadata_walk.h
+++ b/src/gn/metadata_walk.h
@@ -20,7 +20,7 @@
     const std::vector<std::string>& keys_to_extract,
     const std::vector<std::string>& keys_to_walk,
     const SourceDir& rebase_dir,
-    std::set<const Target*>* targets_walked,
+    TargetSet* targets_walked,
     Err* err);
 
 #endif  // TOOLS_GN_METADATAWALK_H_
diff --git a/src/gn/metadata_walk_unittest.cc b/src/gn/metadata_walk_unittest.cc
index 4fcb31d..9f83fa3 100644
--- a/src/gn/metadata_walk_unittest.cc
+++ b/src/gn/metadata_walk_unittest.cc
@@ -50,7 +50,7 @@
   std::vector<std::string> walk_keys;
 
   Err err;
-  std::set<const Target*> targets_walked;
+  TargetSet targets_walked;
   std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
                                            SourceDir(), &targets_walked, &err);
   EXPECT_FALSE(err.has_error());
@@ -62,7 +62,7 @@
   expected.push_back(Value(nullptr, false));
   EXPECT_EQ(result, expected);
 
-  std::set<const Target*> expected_walked_targets;
+  TargetSet expected_walked_targets;
   expected_walked_targets.insert(&one);
   expected_walked_targets.insert(&two);
   EXPECT_EQ(targets_walked, expected_walked_targets);
@@ -100,7 +100,7 @@
   std::vector<std::string> walk_keys;
 
   Err err;
-  std::set<const Target*> targets_walked;
+  TargetSet targets_walked;
   std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
                                            SourceDir(), &targets_walked, &err);
   EXPECT_FALSE(err.has_error());
@@ -111,7 +111,7 @@
   expected.push_back(Value(nullptr, true));
   EXPECT_EQ(result, expected);
 
-  std::set<const Target*> expected_walked_targets;
+  TargetSet expected_walked_targets;
   expected_walked_targets.insert(&one);
   expected_walked_targets.insert(&two);
   EXPECT_EQ(targets_walked, expected_walked_targets);
@@ -157,7 +157,7 @@
   walk_keys.push_back("walk");
 
   Err err;
-  std::set<const Target*> targets_walked;
+  TargetSet targets_walked;
   std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
                                            SourceDir(), &targets_walked, &err);
   EXPECT_FALSE(err.has_error()) << err.message();
@@ -167,7 +167,7 @@
   expected.push_back(Value(nullptr, "foo"));
   EXPECT_EQ(result, expected) << result.size();
 
-  std::set<const Target*> expected_walked_targets;
+  TargetSet expected_walked_targets;
   expected_walked_targets.insert(&one);
   expected_walked_targets.insert(&two);
   EXPECT_EQ(targets_walked, expected_walked_targets);
@@ -197,7 +197,7 @@
   walk_keys.push_back("walk");
 
   Err err;
-  std::set<const Target*> targets_walked;
+  TargetSet targets_walked;
   std::vector<Value> result = WalkMetadata(targets, data_keys, walk_keys,
                                            SourceDir(), &targets_walked, &err);
   EXPECT_TRUE(result.empty());
diff --git a/src/gn/ninja_generated_file_target_writer.cc b/src/gn/ninja_generated_file_target_writer.cc
index e1ad19f..994f322 100644
--- a/src/gn/ninja_generated_file_target_writer.cc
+++ b/src/gn/ninja_generated_file_target_writer.cc
@@ -58,7 +58,7 @@
     CHECK(target_->action_values().outputs().list().size() == 1U);
     contents = Value(target_->action_values().outputs().list()[0].origin(),
                      Value::LIST);
-    std::set<const Target*> targets_walked;
+    TargetSet targets_walked;
     if (!target_->GetMetadata(target_->data_keys(), target_->walk_keys(),
                               target_->rebase(), /*deps_only = */ true,
                               &contents.list_value(), &targets_walked, &err)) {
diff --git a/src/gn/ninja_target_writer.cc b/src/gn/ninja_target_writer.cc
index e85400f..9ddebd9 100644
--- a/src/gn/ninja_target_writer.cc
+++ b/src/gn/ninja_target_writer.cc
@@ -232,7 +232,7 @@
 
   // Hard dependencies that are direct or indirect dependencies.
   // These are large (up to 100s), hence why we check other
-  const std::set<const Target*>& hard_deps(target_->recursive_hard_deps());
+  const TargetSet& hard_deps(target_->recursive_hard_deps());
   for (const Target* target : hard_deps) {
     // BUNDLE_DATA should normally be treated as a data-only dependency
     // (see Target::IsDataOnly()). Only the CREATE_BUNDLE target, that actually
diff --git a/src/gn/qt_creator_writer.cc b/src/gn/qt_creator_writer.cc
index b0fa05c..983bccb 100644
--- a/src/gn/qt_creator_writer.cc
+++ b/src/gn/qt_creator_writer.cc
@@ -86,7 +86,7 @@
   auto all_targets = builder_.GetAllResolvedTargets();
 
   if (root_target_name_.empty()) {
-    targets_ = std::set<const Target*>(all_targets.begin(), all_targets.end());
+    targets_ = TargetSet(all_targets.begin(), all_targets.end());
     return true;
   }
 
diff --git a/src/gn/qt_creator_writer.h b/src/gn/qt_creator_writer.h
index 4571ec1..552e300 100644
--- a/src/gn/qt_creator_writer.h
+++ b/src/gn/qt_creator_writer.h
@@ -43,7 +43,7 @@
   const Builder& builder_;
   base::FilePath project_prefix_;
   std::string root_target_name_;
-  std::set<const Target*> targets_;
+  TargetSet targets_;
   std::set<std::string> sources_;
   std::set<std::string> includes_;
   std::set<std::string> defines_;
diff --git a/src/gn/rust_project_writer.h b/src/gn/rust_project_writer.h
index 5c5d453..3fbdedb 100644
--- a/src/gn/rust_project_writer.h
+++ b/src/gn/rust_project_writer.h
@@ -31,7 +31,7 @@
 
  private:
   // This function visits the deps graph of a target in a DFS fashion.
-  static void VisitDeps(const Target* target, std::set<const Target*>* visited);
+  static void VisitDeps(const Target* target, TargetSet* visited);
 };
 
 #endif  // TOOLS_GN_RUST_PROJECT_WRITER_H_
diff --git a/src/gn/target.cc b/src/gn/target.cc
index 0d225b6..b9e58f3 100644
--- a/src/gn/target.cc
+++ b/src/gn/target.cc
@@ -73,7 +73,7 @@
                                        bool check_private_deps,
                                        bool consider_object_files,
                                        bool check_data_deps,
-                                       std::set<const Target*>* seen_targets) {
+                                       TargetSet* seen_targets) {
   if (seen_targets->find(target) != seen_targets->end())
     return false;  // Already checked this one and it's not found.
   seen_targets->insert(target);
@@ -156,7 +156,7 @@
 bool RecursiveCheckAssertNoDeps(const Target* target,
                                 bool check_this,
                                 const std::vector<LabelPattern>& assert_no,
-                                std::set<const Target*>* visited,
+                                TargetSet* visited,
                                 std::string* failure_path_str,
                                 const LabelPattern** failure_pattern) {
   static const char kIndentPath[] = "  ";
@@ -1144,7 +1144,7 @@
   if (assert_no_deps_.empty())
     return true;
 
-  std::set<const Target*> visited;
+  TargetSet visited;
   std::string failure_path_str;
   const LabelPattern* failure_pattern = nullptr;
 
@@ -1186,7 +1186,7 @@
   // the list of files written by the GN build itself (often response files)
   // can be filtered out of this list.
   OutputFile out_file(settings()->build_settings(), source);
-  std::set<const Target*> seen_targets;
+  TargetSet seen_targets;
   bool check_data_deps = false;
   bool consider_object_files = false;
   if (!EnsureFileIsGeneratedByDependency(this, out_file, true,
@@ -1212,7 +1212,7 @@
                          const SourceDir& rebase_dir,
                          bool deps_only,
                          std::vector<Value>* result,
-                         std::set<const Target*>* targets_walked,
+                         TargetSet* targets_walked,
                          Err* err) const {
   std::vector<Value> next_walk_keys;
   std::vector<Value> current_result;
diff --git a/src/gn/target.h b/src/gn/target.h
index ee5061b..f870548 100644
--- a/src/gn/target.h
+++ b/src/gn/target.h
@@ -29,8 +29,11 @@
 
 class DepsIteratorRange;
 class Settings;
+class Target;
 class Toolchain;
 
+using TargetSet = std::set<const Target*>;
+
 class Target : public Item {
  public:
   enum OutputType {
@@ -172,7 +175,7 @@
                    const SourceDir& rebase_dir,
                    bool deps_only,
                    std::vector<Value>* result,
-                   std::set<const Target*>* targets_walked,
+                   TargetSet* targets_walked,
                    Err* err) const;
 
   // GeneratedFile-related methods.
@@ -328,9 +331,7 @@
     return all_weak_frameworks_;
   }
 
-  const std::set<const Target*>& recursive_hard_deps() const {
-    return recursive_hard_deps_;
-  }
+  const TargetSet& recursive_hard_deps() const { return recursive_hard_deps_; }
 
   std::vector<LabelPattern>& friends() { return friends_; }
   const std::vector<LabelPattern>& friends() const { return friends_; }
@@ -500,7 +501,7 @@
 
   // All hard deps from this target and all dependencies. Filled in when this
   // target is marked resolved. This will not include the current target.
-  std::set<const Target*> recursive_hard_deps_;
+  TargetSet recursive_hard_deps_;
 
   std::vector<LabelPattern> friends_;
   std::vector<LabelPattern> assert_no_deps_;
diff --git a/src/gn/target_unittest.cc b/src/gn/target_unittest.cc
index 0dcff0c..f8cbcd1 100644
--- a/src/gn/target_unittest.cc
+++ b/src/gn/target_unittest.cc
@@ -1403,7 +1403,7 @@
 
   Err err;
   std::vector<Value> result;
-  std::set<const Target*> targets;
+  TargetSet targets;
   one.GetMetadata(data_keys, walk_keys, SourceDir(), false, &result, &targets,
                   &err);
   EXPECT_FALSE(err.has_error());
@@ -1444,7 +1444,7 @@
 
   Err err;
   std::vector<Value> result;
-  std::set<const Target*> targets;
+  TargetSet targets;
   one.GetMetadata(data_keys, walk_keys, SourceDir(), false, &result, &targets,
                   &err);
   EXPECT_FALSE(err.has_error());
@@ -1491,7 +1491,7 @@
 
   Err err;
   std::vector<Value> result;
-  std::set<const Target*> targets;
+  TargetSet targets;
   one.GetMetadata(data_keys, walk_keys, SourceDir(), false, &result, &targets,
                   &err);
   EXPECT_FALSE(err.has_error());
@@ -1540,7 +1540,7 @@
 
   Err err;
   std::vector<Value> result;
-  std::set<const Target*> targets;
+  TargetSet targets;
   one.GetMetadata(data_keys, walk_keys, SourceDir(), false, &result, &targets,
                   &err);
   EXPECT_FALSE(err.has_error()) << err.message();
@@ -1573,7 +1573,7 @@
 
   Err err;
   std::vector<Value> result;
-  std::set<const Target*> targets;
+  TargetSet targets;
   one.GetMetadata(data_keys, walk_keys, SourceDir(), false, &result, &targets,
                   &err);
   EXPECT_TRUE(err.has_error());
diff --git a/src/gn/xcode_writer.cc b/src/gn/xcode_writer.cc
index 19938cd..a71206c 100644
--- a/src/gn/xcode_writer.cc
+++ b/src/gn/xcode_writer.cc
@@ -894,7 +894,7 @@
   // Filter out all target of type EXECUTABLE that are direct dependency of
   // a BUNDLE_DATA target (under the assumption that they will be part of a
   // CREATE_BUNDLE target generating an application bundle).
-  std::set<const Target*> targets(all_targets.begin(), all_targets.end());
+  TargetSet targets(all_targets.begin(), all_targets.end());
   for (const Target* target : all_targets) {
     if (!target->settings()->is_default())
       continue;
