[tint][wgsl][printer] Fix heap use after free

The padding names need to be std::string, not std::string_view as some strings have a shorter lifespan than the set.

Issue: chromium:1468848
Change-Id: I3eb20087389184b6dd87c6d562b1c19f7e7cee14
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/145260
Reviewed-by: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Auto-Submit: Ben Clayton <bclayton@google.com>
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc
index 1e5f029..815442a 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/ast_printer.cc
@@ -334,9 +334,9 @@
     }
     Line() << "struct " << str->name->symbol.Name() << " {";
 
-    Hashset<std::string_view, 8> member_names;
+    Hashset<std::string, 8> member_names;
     for (auto* mem : str->members) {
-        member_names.Add(mem->name->symbol.NameView());
+        member_names.Add(std::string(mem->name->symbol.NameView()));
     }
     size_t padding_idx = 0;
     auto new_padding_name = [&] {
diff --git a/src/tint/lang/wgsl/writer/ast_printer/type_test.cc b/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
index d875905..cca9f8b4 100644
--- a/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
+++ b/src/tint/lang/wgsl/writer/ast_printer/type_test.cc
@@ -205,6 +205,67 @@
 )");
 }
 
+TEST_F(WgslASTPrinterTest, EmitType_StructOffsetDecl_ExceedStaticVectorSize) {
+    auto* s = Structure("S", Vector{
+                                 Member("a", ty.i32(), Vector{MemberOffset(i32(8 * 0))}),
+                                 Member("b", ty.i32(), Vector{MemberOffset(i32(8 * 1))}),
+                                 Member("c", ty.i32(), Vector{MemberOffset(i32(8 * 2))}),
+                                 Member("d", ty.i32(), Vector{MemberOffset(i32(8 * 3))}),
+                                 Member("e", ty.i32(), Vector{MemberOffset(i32(8 * 4))}),
+                                 Member("f", ty.i32(), Vector{MemberOffset(i32(8 * 5))}),
+                                 Member("g", ty.i32(), Vector{MemberOffset(i32(8 * 6))}),
+                                 Member("h", ty.i32(), Vector{MemberOffset(i32(8 * 7))}),
+                                 Member("i", ty.i32(), Vector{MemberOffset(i32(8 * 8))}),
+                                 Member("j", ty.i32(), Vector{MemberOffset(i32(8 * 9))}),
+                             });
+
+    ASTPrinter& gen = Build();
+
+    gen.EmitStructType(s);
+    EXPECT_THAT(gen.Diagnostics(), testing::IsEmpty());
+    EXPECT_EQ(gen.Result(), R"(struct S {
+  /* @offset(0i) */
+  a : i32,
+  @size(4)
+  padding_0 : u32,
+  /* @offset(8i) */
+  b : i32,
+  @size(4)
+  padding_1 : u32,
+  /* @offset(16i) */
+  c : i32,
+  @size(4)
+  padding_2 : u32,
+  /* @offset(24i) */
+  d : i32,
+  @size(4)
+  padding_3 : u32,
+  /* @offset(32i) */
+  e : i32,
+  @size(4)
+  padding_4 : u32,
+  /* @offset(40i) */
+  f : i32,
+  @size(4)
+  padding_5 : u32,
+  /* @offset(48i) */
+  g : i32,
+  @size(4)
+  padding_6 : u32,
+  /* @offset(56i) */
+  h : i32,
+  @size(4)
+  padding_7 : u32,
+  /* @offset(64i) */
+  i : i32,
+  @size(4)
+  padding_8 : u32,
+  /* @offset(72i) */
+  j : i32,
+}
+)");
+}
+
 TEST_F(WgslASTPrinterTest, EmitType_StructOffsetDecl_WithSymbolCollisions) {
     auto* s = Structure("S", Vector{
                                  Member("tint_0_padding", ty.i32(), Vector{MemberOffset(8_a)}),