[msl-writer] Handle remapping remap collisions.

If the remapper give an ident a new name which collides with a future
ident name we need to rename the future name to not collide.

Bug: tint:7
Change-Id: I162a3071f75ed714cee730b78aebefa8c75c77de
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/24521
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
diff --git a/src/writer/msl/namer.cc b/src/writer/msl/namer.cc
index 578917a..43d9806 100644
--- a/src/writer/msl/namer.cc
+++ b/src/writer/msl/namer.cc
@@ -267,7 +267,7 @@
 Namer::~Namer() = default;
 
 std::string Namer::NameFor(const std::string& name) {
-  // If it's in the name make we can just return it. There are no shadow names
+  // If it's in the name map we can just return it. There are no shadow names
   // in WGSL so this has to be unique in the WGSL names, and we've already
   // checked the name collisions with MSL.
   auto it = name_map_.find(name);
@@ -288,6 +288,19 @@
       }
       i++;
     }
+    remapped_names_.insert(ret_name);
+  } else {
+    uint32_t i = 0;
+    // Make sure the ident name wasn't assigned by a remapping.
+    while (true) {
+      auto remap_it = remapped_names_.find(ret_name);
+      if (remap_it == remapped_names_.end()) {
+        break;
+      }
+      ret_name = name + "_" + std::to_string(i);
+      i++;
+    }
+    remapped_names_.insert(ret_name);
   }
 
   name_map_[name] = ret_name;
diff --git a/src/writer/msl/namer.h b/src/writer/msl/namer.h
index be75849..887e5be 100644
--- a/src/writer/msl/namer.h
+++ b/src/writer/msl/namer.h
@@ -17,6 +17,7 @@
 
 #include <string>
 #include <unordered_map>
+#include <unordered_set>
 
 namespace tint {
 namespace writer {
@@ -37,6 +38,8 @@
  private:
   /// Map of original name to new name. The two names may be the same.
   std::unordered_map<std::string, std::string> name_map_;
+  // The list of names taken by the remapper
+  std::unordered_set<std::string> remapped_names_;
 };
 
 }  // namespace msl
diff --git a/src/writer/msl/namer_test.cc b/src/writer/msl/namer_test.cc
index 3348595..3c30fa0 100644
--- a/src/writer/msl/namer_test.cc
+++ b/src/writer/msl/namer_test.cc
@@ -28,13 +28,21 @@
   EXPECT_EQ("my_name", n.NameFor("my_name"));
 }
 
-TEST_F(MslNamerTest, HandlesConflictWithRenamedReservedWord) {
+TEST_F(MslNamerTest, HandlesConflictWithRenamedReservedWordAfterIdentSeen) {
   Namer n;
   EXPECT_EQ("float_tint_0", n.NameFor("float_tint_0"));
   EXPECT_EQ("float_tint_1", n.NameFor("float"));
   EXPECT_EQ("float_tint_0", n.NameFor("float_tint_0"));
 }
 
+TEST_F(MslNamerTest, HandlesConflictWithRenamedReservedWordBeforeIdentSeen) {
+  Namer n;
+  EXPECT_EQ("float_tint_0", n.NameFor("float"));
+  EXPECT_EQ("float_tint_0_0", n.NameFor("float_tint_0"));
+  EXPECT_EQ("float_tint_0_0_0", n.NameFor("float_tint_0_0"));
+  EXPECT_EQ("float_tint_0_0", n.NameFor("float_tint_0"));
+}
+
 using MslReservedNameTest = testing::TestWithParam<std::string>;
 TEST_P(MslReservedNameTest, Emit) {
   auto name = GetParam();