writer/msl: Drop leading  _ for _tint_pad_N fields

Bug: tint:640
Change-Id: I4415dcd2c46bff07bef302620321acc3847a6399
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/47771
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index ea53d7d..12b5711 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -2054,9 +2054,12 @@
 
   uint32_t pad_count = 0;
   auto add_padding = [&](uint32_t size) {
-    out_ << "int8_t _tint_pad_" << pad_count << "[" << size << "];"
-         << std::endl;
-    pad_count++;
+    std::string name;
+    do {
+      name = "tint_pad_" + std::to_string(pad_count++);
+    } while (sem_str->FindMember(program_->Symbols().Get(name)));
+
+    out_ << "int8_t " << name << "[" << size << "];" << std::endl;
   };
 
   increment_indent();
diff --git a/src/writer/msl/generator_impl_type_test.cc b/src/writer/msl/generator_impl_type_test.cc
index 21920a5..9af4778 100644
--- a/src/writer/msl/generator_impl_type_test.cc
+++ b/src/writer/msl/generator_impl_type_test.cc
@@ -242,44 +242,44 @@
   // for each field of the structure s.
 #define ALL_FIELDS()                             \
   FIELD(0x0000, int, a, /*NO SUFFIX*/)           \
-  FIELD(0x0004, int8_t, _tint_pad_0, [124])      \
+  FIELD(0x0004, int8_t, tint_pad_0, [124])       \
   FIELD(0x0080, float, b, /*NO SUFFIX*/)         \
-  FIELD(0x0084, int8_t, _tint_pad_1, [124])      \
+  FIELD(0x0084, int8_t, tint_pad_1, [124])       \
   FIELD(0x0100, packed_float2, c, /*NO SUFFIX*/) \
   FIELD(0x0108, uint, d, /*NO SUFFIX*/)          \
-  FIELD(0x010c, int8_t, _tint_pad_2, [4])        \
+  FIELD(0x010c, int8_t, tint_pad_2, [4])         \
   FIELD(0x0110, packed_float3, e, /*NO SUFFIX*/) \
   FIELD(0x011c, uint, f, /*NO SUFFIX*/)          \
   FIELD(0x0120, packed_float4, g, /*NO SUFFIX*/) \
   FIELD(0x0130, uint, h, /*NO SUFFIX*/)          \
-  FIELD(0x0134, int8_t, _tint_pad_3, [4])        \
+  FIELD(0x0134, int8_t, tint_pad_3, [4])         \
   FIELD(0x0138, float2x2, i, /*NO SUFFIX*/)      \
   FIELD(0x0148, uint, j, /*NO SUFFIX*/)          \
-  FIELD(0x014c, int8_t, _tint_pad_4, [4])        \
+  FIELD(0x014c, int8_t, tint_pad_4, [4])         \
   FIELD(0x0150, float2x3, k, /*NO SUFFIX*/)      \
   FIELD(0x0170, uint, l, /*NO SUFFIX*/)          \
-  FIELD(0x0174, int8_t, _tint_pad_5, [12])       \
+  FIELD(0x0174, int8_t, tint_pad_5, [12])        \
   FIELD(0x0180, float2x4, m, /*NO SUFFIX*/)      \
   FIELD(0x01a0, uint, n, /*NO SUFFIX*/)          \
-  FIELD(0x01a4, int8_t, _tint_pad_6, [4])        \
+  FIELD(0x01a4, int8_t, tint_pad_6, [4])         \
   FIELD(0x01a8, float3x2, o, /*NO SUFFIX*/)      \
   FIELD(0x01c0, uint, p, /*NO SUFFIX*/)          \
-  FIELD(0x01c4, int8_t, _tint_pad_7, [12])       \
+  FIELD(0x01c4, int8_t, tint_pad_7, [12])        \
   FIELD(0x01d0, float3x3, q, /*NO SUFFIX*/)      \
   FIELD(0x0200, uint, r, /*NO SUFFIX*/)          \
-  FIELD(0x0204, int8_t, _tint_pad_8, [12])       \
+  FIELD(0x0204, int8_t, tint_pad_8, [12])        \
   FIELD(0x0210, float3x4, s, /*NO SUFFIX*/)      \
   FIELD(0x0240, uint, t, /*NO SUFFIX*/)          \
-  FIELD(0x0244, int8_t, _tint_pad_9, [4])        \
+  FIELD(0x0244, int8_t, tint_pad_9, [4])         \
   FIELD(0x0248, float4x2, u, /*NO SUFFIX*/)      \
   FIELD(0x0268, uint, v, /*NO SUFFIX*/)          \
-  FIELD(0x026c, int8_t, _tint_pad_10, [4])       \
+  FIELD(0x026c, int8_t, tint_pad_10, [4])        \
   FIELD(0x0270, float4x3, w, /*NO SUFFIX*/)      \
   FIELD(0x02b0, uint, x, /*NO SUFFIX*/)          \
-  FIELD(0x02b4, int8_t, _tint_pad_11, [12])      \
+  FIELD(0x02b4, int8_t, tint_pad_11, [12])       \
   FIELD(0x02c0, float4x4, y, /*NO SUFFIX*/)      \
   FIELD(0x0300, float, z, /*NO SUFFIX*/)         \
-  FIELD(0x0304, int8_t, _tint_pad_12, [124])
+  FIELD(0x0304, int8_t, tint_pad_12, [124])
 
   // Check that the generated string is as expected.
 #define FIELD(ADDR, TYPE, NAME, SUFFIX) \
@@ -343,14 +343,14 @@
 
   // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, NAME, SUFFIX)
   // for each field of the structure s.
-#define ALL_FIELDS()                        \
-  FIELD(0x0000, int, a, /*NO SUFFIX*/)      \
-  FIELD(0x0004, int8_t, _tint_pad_0, [508]) \
-  FIELD(0x0200, inner_x, b, /*NO SUFFIX*/)  \
-  FIELD(0x0600, float, c, /*NO SUFFIX*/)    \
-  FIELD(0x0604, inner_y, d, /*NO SUFFIX*/)  \
-  FIELD(0x0808, float, e, /*NO SUFFIX*/)    \
-  FIELD(0x080c, int8_t, _tint_pad_1, [500])
+#define ALL_FIELDS()                       \
+  FIELD(0x0000, int, a, /*NO SUFFIX*/)     \
+  FIELD(0x0004, int8_t, tint_pad_0, [508]) \
+  FIELD(0x0200, inner_x, b, /*NO SUFFIX*/) \
+  FIELD(0x0600, float, c, /*NO SUFFIX*/)   \
+  FIELD(0x0604, inner_y, d, /*NO SUFFIX*/) \
+  FIELD(0x0808, float, e, /*NO SUFFIX*/)   \
+  FIELD(0x080c, int8_t, tint_pad_1, [500])
 
   // Check that the generated string is as expected.
 #define FIELD(ADDR, TYPE, NAME, SUFFIX) \
@@ -433,15 +433,15 @@
 
   // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, NAME, SUFFIX)
   // for each field of the structure s.
-#define ALL_FIELDS()                        \
-  FIELD(0x0000, int, a, /*NO SUFFIX*/)      \
-  FIELD(0x0004, float, b, [7])              \
-  FIELD(0x0020, float, c, /*NO SUFFIX*/)    \
-  FIELD(0x0024, int8_t, _tint_pad_0, [476]) \
-  FIELD(0x0200, inner, d, [4])              \
-  FIELD(0x1200, float, e, /*NO SUFFIX*/)    \
-  FIELD(0x1204, float, f, [1])              \
-  FIELD(0x1208, int8_t, _tint_pad_1, [504])
+#define ALL_FIELDS()                       \
+  FIELD(0x0000, int, a, /*NO SUFFIX*/)     \
+  FIELD(0x0004, float, b, [7])             \
+  FIELD(0x0020, float, c, /*NO SUFFIX*/)   \
+  FIELD(0x0024, int8_t, tint_pad_0, [476]) \
+  FIELD(0x0200, inner, d, [4])             \
+  FIELD(0x1200, float, e, /*NO SUFFIX*/)   \
+  FIELD(0x1204, float, f, [1])             \
+  FIELD(0x1208, int8_t, tint_pad_1, [504])
 
   // Check that the generated string is as expected.
 #define FIELD(ADDR, TYPE, NAME, SUFFIX) \
@@ -492,6 +492,88 @@
 #undef ALL_FIELDS
 }
 
+TEST_F(MslGeneratorImplTest, AttemptTintPadSymbolCollision) {
+  auto* s = Structure(
+      "S",
+      {
+          // uses symbols tint_pad_[0..9] and tint_pad_[20..35]
+          Member("tint_pad_2", ty.i32(), {MemberSize(32)}),
+          Member("tint_pad_20", ty.f32(), {MemberAlign(128), MemberSize(128)}),
+          Member("tint_pad_33", ty.vec2<f32>()),
+          Member("tint_pad_1", ty.u32()),
+          Member("tint_pad_3", ty.vec3<f32>()),
+          Member("tint_pad_7", ty.u32()),
+          Member("tint_pad_25", ty.vec4<f32>()),
+          Member("tint_pad_5", ty.u32()),
+          Member("tint_pad_27", ty.mat2x2<f32>()),
+          Member("tint_pad_24", ty.u32()),
+          Member("tint_pad_23", ty.mat2x3<f32>()),
+          Member("tint_pad_0", ty.u32()),
+          Member("tint_pad_8", ty.mat2x4<f32>()),
+          Member("tint_pad_26", ty.u32()),
+          Member("tint_pad_29", ty.mat3x2<f32>()),
+          Member("tint_pad_6", ty.u32()),
+          Member("tint_pad_22", ty.mat3x3<f32>()),
+          Member("tint_pad_32", ty.u32()),
+          Member("tint_pad_34", ty.mat3x4<f32>()),
+          Member("tint_pad_35", ty.u32()),
+          Member("tint_pad_30", ty.mat4x2<f32>()),
+          Member("tint_pad_9", ty.u32()),
+          Member("tint_pad_31", ty.mat4x3<f32>()),
+          Member("tint_pad_28", ty.u32()),
+          Member("tint_pad_4", ty.mat4x4<f32>()),
+          Member("tint_pad_21", ty.f32()),
+      });
+
+  Global("G", s, ast::StorageClass::kStorage);
+
+  GeneratorImpl& gen = Build();
+
+  ASSERT_TRUE(gen.EmitStructType(s)) << gen.error();
+  EXPECT_EQ(gen.result(), R"(struct S {
+  /* 0x0000 */ int tint_pad_2;
+  /* 0x0004 */ int8_t tint_pad_10[124];
+  /* 0x0080 */ float tint_pad_20;
+  /* 0x0084 */ int8_t tint_pad_11[124];
+  /* 0x0100 */ packed_float2 tint_pad_33;
+  /* 0x0108 */ uint tint_pad_1;
+  /* 0x010c */ int8_t tint_pad_12[4];
+  /* 0x0110 */ packed_float3 tint_pad_3;
+  /* 0x011c */ uint tint_pad_7;
+  /* 0x0120 */ packed_float4 tint_pad_25;
+  /* 0x0130 */ uint tint_pad_5;
+  /* 0x0134 */ int8_t tint_pad_13[4];
+  /* 0x0138 */ float2x2 tint_pad_27;
+  /* 0x0148 */ uint tint_pad_24;
+  /* 0x014c */ int8_t tint_pad_14[4];
+  /* 0x0150 */ float2x3 tint_pad_23;
+  /* 0x0170 */ uint tint_pad_0;
+  /* 0x0174 */ int8_t tint_pad_15[12];
+  /* 0x0180 */ float2x4 tint_pad_8;
+  /* 0x01a0 */ uint tint_pad_26;
+  /* 0x01a4 */ int8_t tint_pad_16[4];
+  /* 0x01a8 */ float3x2 tint_pad_29;
+  /* 0x01c0 */ uint tint_pad_6;
+  /* 0x01c4 */ int8_t tint_pad_17[12];
+  /* 0x01d0 */ float3x3 tint_pad_22;
+  /* 0x0200 */ uint tint_pad_32;
+  /* 0x0204 */ int8_t tint_pad_18[12];
+  /* 0x0210 */ float3x4 tint_pad_34;
+  /* 0x0240 */ uint tint_pad_35;
+  /* 0x0244 */ int8_t tint_pad_19[4];
+  /* 0x0248 */ float4x2 tint_pad_30;
+  /* 0x0268 */ uint tint_pad_9;
+  /* 0x026c */ int8_t tint_pad_36[4];
+  /* 0x0270 */ float4x3 tint_pad_31;
+  /* 0x02b0 */ uint tint_pad_28;
+  /* 0x02b4 */ int8_t tint_pad_37[12];
+  /* 0x02c0 */ float4x4 tint_pad_4;
+  /* 0x0300 */ float tint_pad_21;
+  /* 0x0304 */ int8_t tint_pad_38[124];
+};
+)");
+}
+
 // TODO(crbug.com/tint/649): Add tests for array with explicit stride.
 
 // TODO(dsinclair): How to translate [[block]]