tint: Suffix builtin return types with '_f32'

If the template type is f32.

See: https://github.com/gpuweb/gpuweb/pull/3629
Change-Id: Ia686d77b4dbc169d7ef69a91d67e45357bee199f
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/111442
Reviewed-by: David Neto <dneto@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/resolver/intrinsic_table.cc b/src/tint/resolver/intrinsic_table.cc
index 6e7e4f8..a04eca4 100644
--- a/src/tint/resolver/intrinsic_table.cc
+++ b/src/tint/resolver/intrinsic_table.cc
@@ -832,7 +832,7 @@
 const sem::Struct* build_modf_result(MatchState& state, const sem::Type* el) {
     auto build_f32 = [&] {
         auto* ty = state.builder.create<sem::F32>();
-        return build_struct(state.builder, "__modf_result", {{"fract", ty}, {"whole", ty}});
+        return build_struct(state.builder, "__modf_result_f32", {{"fract", ty}, {"whole", ty}});
     };
     auto build_f16 = [&] {
         auto* ty = state.builder.create<sem::F16>();
@@ -860,7 +860,7 @@
     auto prefix = "__modf_result_vec" + std::to_string(n.Value());
     auto build_f32 = [&] {
         auto* vec = state.builder.create<sem::Vector>(state.builder.create<sem::F32>(), n.Value());
-        return build_struct(state.builder, prefix, {{"fract", vec}, {"whole", vec}});
+        return build_struct(state.builder, prefix + "_f32", {{"fract", vec}, {"whole", vec}});
     };
     auto build_f16 = [&] {
         auto* vec = state.builder.create<sem::Vector>(state.builder.create<sem::F16>(), n.Value());
@@ -889,7 +889,7 @@
     auto build_f32 = [&] {
         auto* f = state.builder.create<sem::F32>();
         auto* i = state.builder.create<sem::I32>();
-        return build_struct(state.builder, "__frexp_result", {{"fract", f}, {"exp", i}});
+        return build_struct(state.builder, "__frexp_result_f32", {{"fract", f}, {"exp", i}});
     };
     auto build_f16 = [&] {
         auto* f = state.builder.create<sem::F16>();
@@ -920,7 +920,7 @@
     auto build_f32 = [&] {
         auto* f = state.builder.create<sem::Vector>(state.builder.create<sem::F32>(), n.Value());
         auto* e = state.builder.create<sem::Vector>(state.builder.create<sem::I32>(), n.Value());
-        return build_struct(state.builder, prefix, {{"fract", f}, {"exp", e}});
+        return build_struct(state.builder, prefix + "_f32", {{"fract", f}, {"exp", e}});
     };
     auto build_f16 = [&] {
         auto* f = state.builder.create<sem::Vector>(state.builder.create<sem::F16>(), n.Value());
diff --git a/src/tint/writer/glsl/generator_impl_builtin_test.cc b/src/tint/writer/glsl/generator_impl_builtin_test.cc
index cd33dcc..d4b7053 100644
--- a/src/tint/writer/glsl/generator_impl_builtin_test.cc
+++ b/src/tint/writer/glsl/generator_impl_builtin_test.cc
@@ -425,13 +425,13 @@
     ASSERT_TRUE(gen.Generate()) << gen.error();
     EXPECT_EQ(gen.result(), R"(#version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -439,7 +439,7 @@
 
 void test_function() {
   float f = 1.5f;
-  modf_result v = tint_modf(f);
+  modf_result_f32 v = tint_modf(f);
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -496,13 +496,13 @@
     ASSERT_TRUE(gen.Generate()) << gen.error();
     EXPECT_EQ(gen.result(), R"(#version 310 es
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
-modf_result_vec3 tint_modf(vec3 param_0) {
-  modf_result_vec3 result;
+modf_result_vec3_f32 tint_modf(vec3 param_0) {
+  modf_result_vec3_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -510,7 +510,7 @@
 
 void test_function() {
   vec3 f = vec3(1.5f, 2.5f, 3.5f);
-  modf_result_vec3 v = tint_modf(f);
+  modf_result_vec3_f32 v = tint_modf(f);
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -566,14 +566,14 @@
     ASSERT_TRUE(gen.Generate()) << gen.error();
     EXPECT_EQ(gen.result(), R"(#version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void test_function() {
-  modf_result v = modf_result(0.5f, 1.0f);
+  modf_result_f32 v = modf_result_f32(0.5f, 1.0f);
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -621,14 +621,14 @@
     ASSERT_TRUE(gen.Generate()) << gen.error();
     EXPECT_EQ(gen.result(), R"(#version 310 es
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
 
 void test_function() {
-  modf_result_vec3 v = modf_result_vec3(vec3(0.5f), vec3(1.0f, 2.0f, 3.0f));
+  modf_result_vec3_f32 v = modf_result_vec3_f32(vec3(0.5f), vec3(1.0f, 2.0f, 3.0f));
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -677,13 +677,13 @@
     ASSERT_TRUE(gen.Generate()) << gen.error();
     EXPECT_EQ(gen.result(), R"(#version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
-frexp_result tint_frexp(float param_0) {
-  frexp_result result;
+frexp_result_f32 tint_frexp(float param_0) {
+  frexp_result_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -691,7 +691,7 @@
 
 void test_function() {
   float f = 1.0f;
-  frexp_result v = tint_frexp(f);
+  frexp_result_f32 v = tint_frexp(f);
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -748,13 +748,13 @@
     ASSERT_TRUE(gen.Generate()) << gen.error();
     EXPECT_EQ(gen.result(), R"(#version 310 es
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
-frexp_result_vec3 tint_frexp(vec3 param_0) {
-  frexp_result_vec3 result;
+frexp_result_vec3_f32 tint_frexp(vec3 param_0) {
+  frexp_result_vec3_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -762,7 +762,7 @@
 
 void test_function() {
   vec3 f = vec3(0.0f);
-  frexp_result_vec3 v = tint_frexp(f);
+  frexp_result_vec3_f32 v = tint_frexp(f);
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -818,14 +818,14 @@
     ASSERT_TRUE(gen.Generate()) << gen.error();
     EXPECT_EQ(gen.result(), R"(#version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void test_function() {
-  frexp_result v = frexp_result(0.5f, 1);
+  frexp_result_f32 v = frexp_result_f32(0.5f, 1);
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
@@ -873,14 +873,14 @@
     ASSERT_TRUE(gen.Generate()) << gen.error();
     EXPECT_EQ(gen.result(), R"(#version 310 es
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
 
 void test_function() {
-  frexp_result_vec3 v = frexp_result_vec3(vec3(0.0f), ivec3(0));
+  frexp_result_vec3_f32 v = frexp_result_vec3_f32(vec3(0.0f), ivec3(0));
 }
 
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
diff --git a/src/tint/writer/hlsl/generator_impl_builtin_test.cc b/src/tint/writer/hlsl/generator_impl_builtin_test.cc
index a17c3cb..8b5fe07 100644
--- a/src/tint/writer/hlsl/generator_impl_builtin_test.cc
+++ b/src/tint/writer/hlsl/generator_impl_builtin_test.cc
@@ -388,12 +388,12 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct modf_result {
+    EXPECT_EQ(gen.result(), R"(struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -401,7 +401,7 @@
 [numthreads(1, 1, 1)]
 void test_function() {
   const float f = 1.5f;
-  const modf_result v = tint_modf(f);
+  const modf_result_f32 v = tint_modf(f);
   return;
 }
 )");
@@ -442,12 +442,12 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct modf_result_vec3 {
+    EXPECT_EQ(gen.result(), R"(struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
-modf_result_vec3 tint_modf(float3 param_0) {
-  modf_result_vec3 result;
+modf_result_vec3_f32 tint_modf(float3 param_0) {
+  modf_result_vec3_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -455,7 +455,7 @@
 [numthreads(1, 1, 1)]
 void test_function() {
   const float3 f = float3(1.5f, 2.5f, 3.5f);
-  const modf_result_vec3 v = tint_modf(f);
+  const modf_result_vec3_f32 v = tint_modf(f);
   return;
 }
 )");
@@ -495,13 +495,13 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct modf_result {
+    EXPECT_EQ(gen.result(), R"(struct modf_result_f32 {
   float fract;
   float whole;
 };
 [numthreads(1, 1, 1)]
 void test_function() {
-  const modf_result v = {0.5f, 1.0f};
+  const modf_result_f32 v = {0.5f, 1.0f};
   return;
 }
 )");
@@ -533,13 +533,13 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct modf_result_vec3 {
+    EXPECT_EQ(gen.result(), R"(struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 [numthreads(1, 1, 1)]
 void test_function() {
-  const modf_result_vec3 v = {(0.5f).xxx, float3(1.0f, 2.0f, 3.0f)};
+  const modf_result_vec3_f32 v = {(0.5f).xxx, float3(1.0f, 2.0f, 3.0f)};
   return;
 }
 )");
@@ -577,14 +577,14 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct modf_result_vec3 {
+    EXPECT_EQ(gen.result(), R"(struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 [numthreads(1, 1, 1)]
 void test_function() {
-  modf_result_vec3 v = {(0.5f).xxx, float3(1.0f, 2.0f, 3.0f)};
-  const modf_result_vec3 c = {(0.5f).xxx, float3(4.0f, 5.0f, 6.0f)};
+  modf_result_vec3_f32 v = {(0.5f).xxx, float3(1.0f, 2.0f, 3.0f)};
+  const modf_result_vec3_f32 c = {(0.5f).xxx, float3(4.0f, 5.0f, 6.0f)};
   v = c;
   return;
 }
@@ -598,21 +598,21 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct frexp_result {
+    EXPECT_EQ(gen.result(), R"(struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
+frexp_result_f32 tint_frexp(float param_0) {
   float exp;
   float fract = frexp(param_0, exp);
-  frexp_result result = {fract, int(exp)};
+  frexp_result_f32 result = {fract, int(exp)};
   return result;
 }
 
 [numthreads(1, 1, 1)]
 void test_function() {
   float f = 1.0f;
-  frexp_result v = tint_frexp(f);
+  frexp_result_f32 v = tint_frexp(f);
   return;
 }
 )");
@@ -654,21 +654,21 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct frexp_result_vec3 {
+    EXPECT_EQ(gen.result(), R"(struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
-frexp_result_vec3 tint_frexp(float3 param_0) {
+frexp_result_vec3_f32 tint_frexp(float3 param_0) {
   float3 exp;
   float3 fract = frexp(param_0, exp);
-  frexp_result_vec3 result = {fract, int3(exp)};
+  frexp_result_vec3_f32 result = {fract, int3(exp)};
   return result;
 }
 
 [numthreads(1, 1, 1)]
 void test_function() {
   float3 f = (0.0f).xxx;
-  frexp_result_vec3 v = tint_frexp(f);
+  frexp_result_vec3_f32 v = tint_frexp(f);
   return;
 }
 )");
@@ -709,13 +709,13 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct frexp_result {
+    EXPECT_EQ(gen.result(), R"(struct frexp_result_f32 {
   float fract;
   int exp;
 };
 [numthreads(1, 1, 1)]
 void test_function() {
-  const frexp_result v = {0.5f, 1};
+  const frexp_result_f32 v = {0.5f, 1};
   return;
 }
 )");
@@ -747,13 +747,13 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct frexp_result_vec3 {
+    EXPECT_EQ(gen.result(), R"(struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 [numthreads(1, 1, 1)]
 void test_function() {
-  const frexp_result_vec3 v = (frexp_result_vec3)0;
+  const frexp_result_vec3_f32 v = (frexp_result_vec3_f32)0;
   return;
 }
 )");
@@ -791,14 +791,14 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct frexp_result_vec3 {
+    EXPECT_EQ(gen.result(), R"(struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 [numthreads(1, 1, 1)]
 void test_function() {
-  frexp_result_vec3 v = {float3(0.75f, 0.625f, 0.875f), int3(1, 2, 2)};
-  const frexp_result_vec3 c = {float3(0.5625f, 0.6875f, 0.8125f), (3).xxx};
+  frexp_result_vec3_f32 v = {float3(0.75f, 0.625f, 0.875f), int3(1, 2, 2)};
+  const frexp_result_vec3_f32 c = {float3(0.5625f, 0.6875f, 0.8125f), (3).xxx};
   v = c;
   return;
 }
@@ -813,13 +813,13 @@
     GeneratorImpl& gen = SanitizeAndBuild();
 
     ASSERT_TRUE(gen.Generate()) << gen.error();
-    EXPECT_EQ(gen.result(), R"(struct frexp_result {
+    EXPECT_EQ(gen.result(), R"(struct frexp_result_f32 {
   float fract;
   int exp;
 };
 [numthreads(1, 1, 1)]
 void test_function() {
-  frexp_result v = {0.5f, 1};
+  frexp_result_f32 v = {0.5f, 1};
   const float tint_symbol = v.fract;
   return;
 }
diff --git a/src/tint/writer/msl/generator_impl_builtin_test.cc b/src/tint/writer/msl/generator_impl_builtin_test.cc
index 7d000b1..7a69a14 100644
--- a/src/tint/writer/msl/generator_impl_builtin_test.cc
+++ b/src/tint/writer/msl/generator_impl_builtin_test.cc
@@ -416,19 +416,19 @@
 
 using namespace metal;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 kernel void test_function() {
   float const f = 1.5f;
-  modf_result const v = tint_modf(f);
+  modf_result_f32 const v = tint_modf(f);
   return;
 }
 
@@ -478,19 +478,19 @@
 
 using namespace metal;
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
-modf_result_vec3 tint_modf(float3 param_0) {
-  modf_result_vec3 result;
+modf_result_vec3_f32 tint_modf(float3 param_0) {
+  modf_result_vec3_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 kernel void test_function() {
   float3 const f = float3(1.5f, 2.5f, 3.5f);
-  modf_result_vec3 const v = tint_modf(f);
+  modf_result_vec3_f32 const v = tint_modf(f);
   return;
 }
 
@@ -539,12 +539,12 @@
 
 using namespace metal;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 kernel void test_function() {
-  modf_result const v = modf_result{.fract=0.5f, .whole=1.0f};
+  modf_result_f32 const v = modf_result_f32{.fract=0.5f, .whole=1.0f};
   return;
 }
 
@@ -585,12 +585,12 @@
 
 using namespace metal;
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 kernel void test_function() {
-  modf_result_vec3 const v = modf_result_vec3{.fract=float3(0.5f), .whole=float3(1.0f, 2.0f, 3.0f)};
+  modf_result_vec3_f32 const v = modf_result_vec3_f32{.fract=float3(0.5f), .whole=float3(1.0f, 2.0f, 3.0f)};
   return;
 }
 
@@ -632,19 +632,19 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
-  frexp_result result;
+frexp_result_f32 tint_frexp(float param_0) {
+  frexp_result_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
 
 kernel void test_function() {
   float f = 1.0f;
-  frexp_result v = tint_frexp(f);
+  frexp_result_f32 v = tint_frexp(f);
   return;
 }
 
@@ -694,19 +694,19 @@
 
 using namespace metal;
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
-frexp_result_vec3 tint_frexp(float3 param_0) {
-  frexp_result_vec3 result;
+frexp_result_vec3_f32 tint_frexp(float3 param_0) {
+  frexp_result_vec3_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
 
 kernel void test_function() {
   float3 f = float3(0.0f);
-  frexp_result_vec3 v = tint_frexp(f);
+  frexp_result_vec3_f32 v = tint_frexp(f);
   return;
 }
 
@@ -755,12 +755,12 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 kernel void test_function() {
-  frexp_result const v = frexp_result{.fract=0.5f, .exp=1};
+  frexp_result_f32 const v = frexp_result_f32{.fract=0.5f, .exp=1};
   return;
 }
 
@@ -801,12 +801,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 kernel void test_function() {
-  frexp_result_vec3 const v = frexp_result_vec3{};
+  frexp_result_vec3_f32 const v = frexp_result_vec3_f32{};
   return;
 }
 
diff --git a/src/tint/writer/spirv/builder_builtin_test.cc b/src/tint/writer/spirv/builder_builtin_test.cc
index e089122..caa7d9c 100644
--- a/src/tint/writer/spirv/builder_builtin_test.cc
+++ b/src/tint/writer/spirv/builder_builtin_test.cc
@@ -1653,7 +1653,7 @@
 OpExecutionMode %3 OriginUpperLeft
 OpName %3 "a_func"
 OpName %10 "vec"
-OpName %14 "__modf_result_vec2"
+OpName %14 "__modf_result_vec2_f32"
 OpMemberName %14 0 "fract"
 OpMemberName %14 1 "whole"
 OpMemberDecorate %14 0 Offset 0
@@ -1760,7 +1760,7 @@
 OpEntryPoint Fragment %3 "a_func"
 OpExecutionMode %3 OriginUpperLeft
 OpName %3 "a_func"
-OpName %6 "__modf_result_vec2"
+OpName %6 "__modf_result_vec2_f32"
 OpMemberName %6 0 "fract"
 OpMemberName %6 1 "whole"
 OpMemberDecorate %6 0 Offset 0
@@ -1857,7 +1857,7 @@
 OpExecutionMode %3 OriginUpperLeft
 OpName %3 "a_func"
 OpName %10 "vec"
-OpName %14 "__frexp_result_vec2"
+OpName %14 "__frexp_result_vec2_f32"
 OpMemberName %14 0 "fract"
 OpMemberName %14 1 "exp"
 OpMemberDecorate %14 0 Offset 0
@@ -1967,7 +1967,7 @@
 OpEntryPoint Fragment %3 "a_func"
 OpExecutionMode %3 OriginUpperLeft
 OpName %3 "a_func"
-OpName %6 "__frexp_result_vec2"
+OpName %6 "__frexp_result_vec2_f32"
 OpMemberName %6 0 "fract"
 OpMemberName %6 1 "exp"
 OpMemberDecorate %6 0 Offset 0
@@ -2066,7 +2066,7 @@
 OpExecutionMode %3 OriginUpperLeft
 OpName %3 "a_func"
 OpName %10 "vec"
-OpName %14 "__frexp_result_vec2"
+OpName %14 "__frexp_result_vec2_f32"
 OpMemberName %14 0 "fract"
 OpMemberName %14 1 "exp"
 OpMemberDecorate %14 0 Offset 0
diff --git a/test/tint/bug/tint/1757.wgsl.expected.dxc.hlsl b/test/tint/bug/tint/1757.wgsl.expected.dxc.hlsl
index 895420b..389529a 100644
--- a/test/tint/bug/tint/1757.wgsl.expected.dxc.hlsl
+++ b/test/tint/bug/tint/1757.wgsl.expected.dxc.hlsl
@@ -2,13 +2,13 @@
     let sig : f32 = res.sig;
                         ^^^
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result res = {0.61500001f, 1};
+  const frexp_result_f32 res = {0.61500001f, 1};
   const int exp = res.exp;
   const float sig = res.fract;
   return;
diff --git a/test/tint/bug/tint/1757.wgsl.expected.fxc.hlsl b/test/tint/bug/tint/1757.wgsl.expected.fxc.hlsl
index 895420b..389529a 100644
--- a/test/tint/bug/tint/1757.wgsl.expected.fxc.hlsl
+++ b/test/tint/bug/tint/1757.wgsl.expected.fxc.hlsl
@@ -2,13 +2,13 @@
     let sig : f32 = res.sig;
                         ^^^
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result res = {0.61500001f, 1};
+  const frexp_result_f32 res = {0.61500001f, 1};
   const int exp = res.exp;
   const float sig = res.fract;
   return;
diff --git a/test/tint/bug/tint/1757.wgsl.expected.glsl b/test/tint/bug/tint/1757.wgsl.expected.glsl
index e6ff7ca..39bb6d3 100644
--- a/test/tint/bug/tint/1757.wgsl.expected.glsl
+++ b/test/tint/bug/tint/1757.wgsl.expected.glsl
@@ -4,14 +4,14 @@
 
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void tint_symbol() {
-  frexp_result res = frexp_result(0.61500001f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.61500001f, 1);
   int tint_symbol_1 = res.exp;
   float sig = res.fract;
 }
diff --git a/test/tint/bug/tint/1757.wgsl.expected.msl b/test/tint/bug/tint/1757.wgsl.expected.msl
index 0d960e7..815c2a4 100644
--- a/test/tint/bug/tint/1757.wgsl.expected.msl
+++ b/test/tint/bug/tint/1757.wgsl.expected.msl
@@ -6,12 +6,12 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 kernel void tint_symbol() {
-  frexp_result const res = frexp_result{.fract=0.61500001f, .exp=1};
+  frexp_result_f32 const res = frexp_result_f32{.fract=0.61500001f, .exp=1};
   int const exp = res.exp;
   float const sig = res.fract;
   return;
diff --git a/test/tint/bug/tint/1757.wgsl.expected.spvasm b/test/tint/bug/tint/1757.wgsl.expected.spvasm
index 79b00c0..a4bb6cd 100644
--- a/test/tint/bug/tint/1757.wgsl.expected.spvasm
+++ b/test/tint/bug/tint/1757.wgsl.expected.spvasm
@@ -12,19 +12,19 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__frexp_result "__frexp_result"
-               OpMemberName %__frexp_result 0 "fract"
-               OpMemberName %__frexp_result 1 "exp"
-               OpMemberDecorate %__frexp_result 0 Offset 0
-               OpMemberDecorate %__frexp_result 1 Offset 4
+               OpName %__frexp_result_f32 "__frexp_result_f32"
+               OpMemberName %__frexp_result_f32 0 "fract"
+               OpMemberName %__frexp_result_f32 1 "exp"
+               OpMemberDecorate %__frexp_result_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_f32 1 Offset 4
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
         %int = OpTypeInt 32 1
-%__frexp_result = OpTypeStruct %float %int
+%__frexp_result_f32 = OpTypeStruct %float %int
 %float_0_61500001 = OpConstant %float 0.61500001
       %int_1 = OpConstant %int 1
-         %10 = OpConstantComposite %__frexp_result %float_0_61500001 %int_1
+         %10 = OpConstantComposite %__frexp_result_f32 %float_0_61500001 %int_1
        %main = OpFunction %void None %1
           %4 = OpLabel
          %11 = OpCompositeExtract %int %10 1
diff --git a/test/tint/builtins/frexp.wgsl.expected.dxc.hlsl b/test/tint/builtins/frexp.wgsl.expected.dxc.hlsl
index 3e21c7f..8afb719 100644
--- a/test/tint/builtins/frexp.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/frexp.wgsl.expected.dxc.hlsl
@@ -1,10 +1,10 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result res = {0.61500001f, 1};
+  const frexp_result_f32 res = {0.61500001f, 1};
   const int exp = res.exp;
   const float fract = res.fract;
   return;
diff --git a/test/tint/builtins/frexp.wgsl.expected.fxc.hlsl b/test/tint/builtins/frexp.wgsl.expected.fxc.hlsl
index 3e21c7f..8afb719 100644
--- a/test/tint/builtins/frexp.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/frexp.wgsl.expected.fxc.hlsl
@@ -1,10 +1,10 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result res = {0.61500001f, 1};
+  const frexp_result_f32 res = {0.61500001f, 1};
   const int exp = res.exp;
   const float fract = res.fract;
   return;
diff --git a/test/tint/builtins/frexp.wgsl.expected.glsl b/test/tint/builtins/frexp.wgsl.expected.glsl
index d124447..fbf6fb3 100644
--- a/test/tint/builtins/frexp.wgsl.expected.glsl
+++ b/test/tint/builtins/frexp.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void tint_symbol() {
-  frexp_result res = frexp_result(0.61500001f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.61500001f, 1);
   int tint_symbol_1 = res.exp;
   float tint_symbol_2 = res.fract;
 }
diff --git a/test/tint/builtins/frexp.wgsl.expected.msl b/test/tint/builtins/frexp.wgsl.expected.msl
index 1bce450..d0791c7 100644
--- a/test/tint/builtins/frexp.wgsl.expected.msl
+++ b/test/tint/builtins/frexp.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 kernel void tint_symbol() {
-  frexp_result const res = frexp_result{.fract=0.61500001f, .exp=1};
+  frexp_result_f32 const res = frexp_result_f32{.fract=0.61500001f, .exp=1};
   int const exp = res.exp;
   float const fract = res.fract;
   return;
diff --git a/test/tint/builtins/frexp.wgsl.expected.spvasm b/test/tint/builtins/frexp.wgsl.expected.spvasm
index 69cdd2f..3903cf4 100644
--- a/test/tint/builtins/frexp.wgsl.expected.spvasm
+++ b/test/tint/builtins/frexp.wgsl.expected.spvasm
@@ -8,19 +8,19 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__frexp_result "__frexp_result"
-               OpMemberName %__frexp_result 0 "fract"
-               OpMemberName %__frexp_result 1 "exp"
-               OpMemberDecorate %__frexp_result 0 Offset 0
-               OpMemberDecorate %__frexp_result 1 Offset 4
+               OpName %__frexp_result_f32 "__frexp_result_f32"
+               OpMemberName %__frexp_result_f32 0 "fract"
+               OpMemberName %__frexp_result_f32 1 "exp"
+               OpMemberDecorate %__frexp_result_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_f32 1 Offset 4
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
         %int = OpTypeInt 32 1
-%__frexp_result = OpTypeStruct %float %int
+%__frexp_result_f32 = OpTypeStruct %float %int
 %float_0_61500001 = OpConstant %float 0.61500001
       %int_1 = OpConstant %int 1
-         %10 = OpConstantComposite %__frexp_result %float_0_61500001 %int_1
+         %10 = OpConstantComposite %__frexp_result_f32 %float_0_61500001 %int_1
        %main = OpFunction %void None %1
           %4 = OpLabel
          %11 = OpCompositeExtract %int %10 1
diff --git a/test/tint/builtins/frexp/scalar/const.wgsl.expected.dxc.hlsl b/test/tint/builtins/frexp/scalar/const.wgsl.expected.dxc.hlsl
index f14cccd..1a59a02 100644
--- a/test/tint/builtins/frexp/scalar/const.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/frexp/scalar/const.wgsl.expected.dxc.hlsl
@@ -1,10 +1,10 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result res = {0.625f, 1};
+  const frexp_result_f32 res = {0.625f, 1};
   const float fract = res.fract;
   const int exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/scalar/const.wgsl.expected.fxc.hlsl b/test/tint/builtins/frexp/scalar/const.wgsl.expected.fxc.hlsl
index f14cccd..1a59a02 100644
--- a/test/tint/builtins/frexp/scalar/const.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/frexp/scalar/const.wgsl.expected.fxc.hlsl
@@ -1,10 +1,10 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result res = {0.625f, 1};
+  const frexp_result_f32 res = {0.625f, 1};
   const float fract = res.fract;
   const int exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/scalar/const.wgsl.expected.glsl b/test/tint/builtins/frexp/scalar/const.wgsl.expected.glsl
index ec8ca7c..bfd52ec 100644
--- a/test/tint/builtins/frexp/scalar/const.wgsl.expected.glsl
+++ b/test/tint/builtins/frexp/scalar/const.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void tint_symbol() {
-  frexp_result res = frexp_result(0.625f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.625f, 1);
   float tint_symbol_2 = res.fract;
   int tint_symbol_3 = res.exp;
 }
diff --git a/test/tint/builtins/frexp/scalar/const.wgsl.expected.msl b/test/tint/builtins/frexp/scalar/const.wgsl.expected.msl
index f0dcbcf..b539aac 100644
--- a/test/tint/builtins/frexp/scalar/const.wgsl.expected.msl
+++ b/test/tint/builtins/frexp/scalar/const.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 kernel void tint_symbol() {
-  frexp_result const res = frexp_result{.fract=0.625f, .exp=1};
+  frexp_result_f32 const res = frexp_result_f32{.fract=0.625f, .exp=1};
   float const fract = res.fract;
   int const exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/scalar/const.wgsl.expected.spvasm b/test/tint/builtins/frexp/scalar/const.wgsl.expected.spvasm
index 541d342..d691579 100644
--- a/test/tint/builtins/frexp/scalar/const.wgsl.expected.spvasm
+++ b/test/tint/builtins/frexp/scalar/const.wgsl.expected.spvasm
@@ -8,19 +8,19 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__frexp_result "__frexp_result"
-               OpMemberName %__frexp_result 0 "fract"
-               OpMemberName %__frexp_result 1 "exp"
-               OpMemberDecorate %__frexp_result 0 Offset 0
-               OpMemberDecorate %__frexp_result 1 Offset 4
+               OpName %__frexp_result_f32 "__frexp_result_f32"
+               OpMemberName %__frexp_result_f32 0 "fract"
+               OpMemberName %__frexp_result_f32 1 "exp"
+               OpMemberDecorate %__frexp_result_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_f32 1 Offset 4
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
         %int = OpTypeInt 32 1
-%__frexp_result = OpTypeStruct %float %int
+%__frexp_result_f32 = OpTypeStruct %float %int
 %float_0_625 = OpConstant %float 0.625
       %int_1 = OpConstant %int 1
-         %10 = OpConstantComposite %__frexp_result %float_0_625 %int_1
+         %10 = OpConstantComposite %__frexp_result_f32 %float_0_625 %int_1
        %main = OpFunction %void None %1
           %4 = OpLabel
          %11 = OpCompositeExtract %float %10 0
diff --git a/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.dxc.hlsl b/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.dxc.hlsl
index 19792b6..c925f5c 100644
--- a/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.dxc.hlsl
@@ -1,12 +1,12 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result tint_symbol_1 = {0.625f, 1};
+  const frexp_result_f32 tint_symbol_1 = {0.625f, 1};
   const float fract = tint_symbol_1.fract;
-  const frexp_result tint_symbol_2 = {0.625f, 1};
+  const frexp_result_f32 tint_symbol_2 = {0.625f, 1};
   const int exp = tint_symbol_2.exp;
   return;
 }
diff --git a/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.fxc.hlsl b/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.fxc.hlsl
index 19792b6..c925f5c 100644
--- a/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.fxc.hlsl
@@ -1,12 +1,12 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result tint_symbol_1 = {0.625f, 1};
+  const frexp_result_f32 tint_symbol_1 = {0.625f, 1};
   const float fract = tint_symbol_1.fract;
-  const frexp_result tint_symbol_2 = {0.625f, 1};
+  const frexp_result_f32 tint_symbol_2 = {0.625f, 1};
   const int exp = tint_symbol_2.exp;
   return;
 }
diff --git a/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.glsl b/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.glsl
index 6667f5f..d84878f 100644
--- a/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.glsl
+++ b/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.glsl
@@ -1,15 +1,15 @@
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void tint_symbol() {
-  frexp_result tint_symbol_4 = frexp_result(0.625f, 1);
+  frexp_result_f32 tint_symbol_4 = frexp_result_f32(0.625f, 1);
   float tint_symbol_2 = tint_symbol_4.fract;
-  frexp_result tint_symbol_5 = frexp_result(0.625f, 1);
+  frexp_result_f32 tint_symbol_5 = frexp_result_f32(0.625f, 1);
   int tint_symbol_3 = tint_symbol_5.exp;
 }
 
diff --git a/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.msl b/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.msl
index c2d6c14..cbc89a2 100644
--- a/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.msl
+++ b/test/tint/builtins/frexp/scalar/const_members.wgsl.expected.msl
@@ -2,14 +2,14 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 kernel void tint_symbol() {
-  frexp_result const tint_symbol_1 = frexp_result{.fract=0.625f, .exp=1};
+  frexp_result_f32 const tint_symbol_1 = frexp_result_f32{.fract=0.625f, .exp=1};
   float const fract = tint_symbol_1.fract;
-  frexp_result const tint_symbol_2 = frexp_result{.fract=0.625f, .exp=1};
+  frexp_result_f32 const tint_symbol_2 = frexp_result_f32{.fract=0.625f, .exp=1};
   int const exp = tint_symbol_2.exp;
   return;
 }
diff --git a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.dxc.hlsl b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.dxc.hlsl
index b1dc653..a848a4f 100644
--- a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.dxc.hlsl
@@ -1,20 +1,20 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
+frexp_result_f32 tint_frexp(float param_0) {
   float exp;
   float fract = frexp(param_0, exp);
-  frexp_result result = {fract, int(exp)};
+  frexp_result_f32 result = {fract, int(exp)};
   return result;
 }
 
 [numthreads(1, 1, 1)]
 void main() {
   const float runtime_in = 1.25f;
-  frexp_result res = {0.625f, 1};
+  frexp_result_f32 res = {0.625f, 1};
   res = tint_frexp(runtime_in);
-  const frexp_result c = {0.625f, 1};
+  const frexp_result_f32 c = {0.625f, 1};
   res = c;
   const float fract = res.fract;
   const int exp = res.exp;
diff --git a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.fxc.hlsl b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.fxc.hlsl
index b1dc653..a848a4f 100644
--- a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.fxc.hlsl
@@ -1,20 +1,20 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
+frexp_result_f32 tint_frexp(float param_0) {
   float exp;
   float fract = frexp(param_0, exp);
-  frexp_result result = {fract, int(exp)};
+  frexp_result_f32 result = {fract, int(exp)};
   return result;
 }
 
 [numthreads(1, 1, 1)]
 void main() {
   const float runtime_in = 1.25f;
-  frexp_result res = {0.625f, 1};
+  frexp_result_f32 res = {0.625f, 1};
   res = tint_frexp(runtime_in);
-  const frexp_result c = {0.625f, 1};
+  const frexp_result_f32 c = {0.625f, 1};
   res = c;
   const float fract = res.fract;
   const int exp = res.exp;
diff --git a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.glsl b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.glsl
index cd9010d..c60a37a 100644
--- a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.glsl
+++ b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
-frexp_result tint_frexp(float param_0) {
-  frexp_result result;
+frexp_result_f32 tint_frexp(float param_0) {
+  frexp_result_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -14,9 +14,9 @@
 
 void tint_symbol() {
   float runtime_in = 1.25f;
-  frexp_result res = frexp_result(0.625f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.625f, 1);
   res = tint_frexp(runtime_in);
-  res = frexp_result(0.625f, 1);
+  res = frexp_result_f32(0.625f, 1);
   float tint_symbol_1 = res.fract;
   int tint_symbol_2 = res.exp;
 }
diff --git a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.msl b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.msl
index 029f4e2..1b6374b 100644
--- a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.msl
+++ b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.msl
@@ -2,21 +2,21 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
-  frexp_result result;
+frexp_result_f32 tint_frexp(float param_0) {
+  frexp_result_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
 
 kernel void tint_symbol() {
   float const runtime_in = 1.25f;
-  frexp_result res = frexp_result{.fract=0.625f, .exp=1};
+  frexp_result_f32 res = frexp_result_f32{.fract=0.625f, .exp=1};
   res = tint_frexp(runtime_in);
-  res = frexp_result{.fract=0.625f, .exp=1};
+  res = frexp_result_f32{.fract=0.625f, .exp=1};
   float const fract = res.fract;
   int const exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.spvasm b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.spvasm
index d87b243..35b7e18 100644
--- a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.spvasm
+++ b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.spvasm
@@ -9,23 +9,23 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__frexp_result "__frexp_result"
-               OpMemberName %__frexp_result 0 "fract"
-               OpMemberName %__frexp_result 1 "exp"
+               OpName %__frexp_result_f32 "__frexp_result_f32"
+               OpMemberName %__frexp_result_f32 0 "fract"
+               OpMemberName %__frexp_result_f32 1 "exp"
                OpName %res "res"
-               OpMemberDecorate %__frexp_result 0 Offset 0
-               OpMemberDecorate %__frexp_result 1 Offset 4
+               OpMemberDecorate %__frexp_result_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_f32 1 Offset 4
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
  %float_1_25 = OpConstant %float 1.25
         %int = OpTypeInt 32 1
-%__frexp_result = OpTypeStruct %float %int
+%__frexp_result_f32 = OpTypeStruct %float %int
 %float_0_625 = OpConstant %float 0.625
       %int_1 = OpConstant %int 1
-         %11 = OpConstantComposite %__frexp_result %float_0_625 %int_1
-%_ptr_Function___frexp_result = OpTypePointer Function %__frexp_result
-         %14 = OpConstantNull %__frexp_result
+         %11 = OpConstantComposite %__frexp_result_f32 %float_0_625 %int_1
+%_ptr_Function___frexp_result_f32 = OpTypePointer Function %__frexp_result_f32
+         %14 = OpConstantNull %__frexp_result_f32
        %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
 %_ptr_Function_float = OpTypePointer Function %float
@@ -33,9 +33,9 @@
 %_ptr_Function_int = OpTypePointer Function %int
        %main = OpFunction %void None %1
           %4 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result Function %14
+        %res = OpVariable %_ptr_Function___frexp_result_f32 Function %14
                OpStore %res %11
-         %15 = OpExtInst %__frexp_result %16 FrexpStruct %float_1_25
+         %15 = OpExtInst %__frexp_result_f32 %16 FrexpStruct %float_1_25
                OpStore %res %15
                OpStore %res %11
          %20 = OpAccessChain %_ptr_Function_float %res %uint_0
diff --git a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.dxc.hlsl b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.dxc.hlsl
index 3f6cc50..fdf14df 100644
--- a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.dxc.hlsl
@@ -1,18 +1,18 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
+frexp_result_f32 tint_frexp(float param_0) {
   float exp;
   float fract = frexp(param_0, exp);
-  frexp_result result = {fract, int(exp)};
+  frexp_result_f32 result = {fract, int(exp)};
   return result;
 }
 
 [numthreads(1, 1, 1)]
 void main() {
   const float tint_symbol = 1.25f;
-  const frexp_result res = tint_frexp(tint_symbol);
+  const frexp_result_f32 res = tint_frexp(tint_symbol);
   const float fract = res.fract;
   const int exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.fxc.hlsl b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.fxc.hlsl
index 3f6cc50..fdf14df 100644
--- a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.fxc.hlsl
@@ -1,18 +1,18 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
+frexp_result_f32 tint_frexp(float param_0) {
   float exp;
   float fract = frexp(param_0, exp);
-  frexp_result result = {fract, int(exp)};
+  frexp_result_f32 result = {fract, int(exp)};
   return result;
 }
 
 [numthreads(1, 1, 1)]
 void main() {
   const float tint_symbol = 1.25f;
-  const frexp_result res = tint_frexp(tint_symbol);
+  const frexp_result_f32 res = tint_frexp(tint_symbol);
   const float fract = res.fract;
   const int exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.glsl b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.glsl
index 4e3c642..d1e998b 100644
--- a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.glsl
+++ b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
-frexp_result tint_frexp(float param_0) {
-  frexp_result result;
+frexp_result_f32 tint_frexp(float param_0) {
+  frexp_result_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void tint_symbol() {
   float tint_symbol_1 = 1.25f;
-  frexp_result res = tint_frexp(tint_symbol_1);
+  frexp_result_f32 res = tint_frexp(tint_symbol_1);
   float tint_symbol_2 = res.fract;
   int tint_symbol_3 = res.exp;
 }
diff --git a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.msl b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.msl
index 97eff80..e428a47 100644
--- a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.msl
+++ b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
-  frexp_result result;
+frexp_result_f32 tint_frexp(float param_0) {
+  frexp_result_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
 
 kernel void tint_symbol() {
   float const in = 1.25f;
-  frexp_result const res = tint_frexp(in);
+  frexp_result_f32 const res = tint_frexp(in);
   float const fract = res.fract;
   int const exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.spvasm b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.spvasm
index cf7a5ce..30ebd72 100644
--- a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.spvasm
+++ b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.spvasm
@@ -9,20 +9,20 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__frexp_result "__frexp_result"
-               OpMemberName %__frexp_result 0 "fract"
-               OpMemberName %__frexp_result 1 "exp"
-               OpMemberDecorate %__frexp_result 0 Offset 0
-               OpMemberDecorate %__frexp_result 1 Offset 4
+               OpName %__frexp_result_f32 "__frexp_result_f32"
+               OpMemberName %__frexp_result_f32 0 "fract"
+               OpMemberName %__frexp_result_f32 1 "exp"
+               OpMemberDecorate %__frexp_result_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_f32 1 Offset 4
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
  %float_1_25 = OpConstant %float 1.25
         %int = OpTypeInt 32 1
-%__frexp_result = OpTypeStruct %float %int
+%__frexp_result_f32 = OpTypeStruct %float %int
        %main = OpFunction %void None %1
           %4 = OpLabel
-          %7 = OpExtInst %__frexp_result %10 FrexpStruct %float_1_25
+          %7 = OpExtInst %__frexp_result_f32 %10 FrexpStruct %float_1_25
          %11 = OpCompositeExtract %float %7 0
          %12 = OpCompositeExtract %int %7 1
                OpReturn
diff --git a/test/tint/builtins/frexp/vector/const.wgsl.expected.dxc.hlsl b/test/tint/builtins/frexp/vector/const.wgsl.expected.dxc.hlsl
index 8bba86f..96a9c15 100644
--- a/test/tint/builtins/frexp/vector/const.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/frexp/vector/const.wgsl.expected.dxc.hlsl
@@ -1,10 +1,10 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result_vec2 res = {float2(0.625f, 0.9375f), int2(1, 2)};
+  const frexp_result_vec2_f32 res = {float2(0.625f, 0.9375f), int2(1, 2)};
   const float2 fract = res.fract;
   const int2 exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/vector/const.wgsl.expected.fxc.hlsl b/test/tint/builtins/frexp/vector/const.wgsl.expected.fxc.hlsl
index 8bba86f..96a9c15 100644
--- a/test/tint/builtins/frexp/vector/const.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/frexp/vector/const.wgsl.expected.fxc.hlsl
@@ -1,10 +1,10 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result_vec2 res = {float2(0.625f, 0.9375f), int2(1, 2)};
+  const frexp_result_vec2_f32 res = {float2(0.625f, 0.9375f), int2(1, 2)};
   const float2 fract = res.fract;
   const int2 exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/vector/const.wgsl.expected.glsl b/test/tint/builtins/frexp/vector/const.wgsl.expected.glsl
index 1bf02ab..8f3813a 100644
--- a/test/tint/builtins/frexp/vector/const.wgsl.expected.glsl
+++ b/test/tint/builtins/frexp/vector/const.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void tint_symbol() {
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.625f, 0.9375f), ivec2(1, 2));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.625f, 0.9375f), ivec2(1, 2));
   vec2 tint_symbol_2 = res.fract;
   ivec2 tint_symbol_3 = res.exp;
 }
diff --git a/test/tint/builtins/frexp/vector/const.wgsl.expected.msl b/test/tint/builtins/frexp/vector/const.wgsl.expected.msl
index fb5dd60..67aca71 100644
--- a/test/tint/builtins/frexp/vector/const.wgsl.expected.msl
+++ b/test/tint/builtins/frexp/vector/const.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 kernel void tint_symbol() {
-  frexp_result_vec2 const res = frexp_result_vec2{.fract=float2(0.625f, 0.9375f), .exp=int2(1, 2)};
+  frexp_result_vec2_f32 const res = frexp_result_vec2_f32{.fract=float2(0.625f, 0.9375f), .exp=int2(1, 2)};
   float2 const fract = res.fract;
   int2 const exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/vector/const.wgsl.expected.spvasm b/test/tint/builtins/frexp/vector/const.wgsl.expected.spvasm
index 50a68f2..9871271 100644
--- a/test/tint/builtins/frexp/vector/const.wgsl.expected.spvasm
+++ b/test/tint/builtins/frexp/vector/const.wgsl.expected.spvasm
@@ -8,25 +8,25 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__frexp_result_vec2 "__frexp_result_vec2"
-               OpMemberName %__frexp_result_vec2 0 "fract"
-               OpMemberName %__frexp_result_vec2 1 "exp"
-               OpMemberDecorate %__frexp_result_vec2 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec2 1 Offset 8
+               OpName %__frexp_result_vec2_f32 "__frexp_result_vec2_f32"
+               OpMemberName %__frexp_result_vec2_f32 0 "fract"
+               OpMemberName %__frexp_result_vec2_f32 1 "exp"
+               OpMemberDecorate %__frexp_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec2_f32 1 Offset 8
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
     %v2float = OpTypeVector %float 2
         %int = OpTypeInt 32 1
       %v2int = OpTypeVector %int 2
-%__frexp_result_vec2 = OpTypeStruct %v2float %v2int
+%__frexp_result_vec2_f32 = OpTypeStruct %v2float %v2int
 %float_0_625 = OpConstant %float 0.625
 %float_0_9375 = OpConstant %float 0.9375
          %12 = OpConstantComposite %v2float %float_0_625 %float_0_9375
       %int_1 = OpConstant %int 1
       %int_2 = OpConstant %int 2
          %15 = OpConstantComposite %v2int %int_1 %int_2
-         %16 = OpConstantComposite %__frexp_result_vec2 %12 %15
+         %16 = OpConstantComposite %__frexp_result_vec2_f32 %12 %15
        %main = OpFunction %void None %1
           %4 = OpLabel
          %17 = OpCompositeExtract %v2float %16 0
diff --git a/test/tint/builtins/frexp/vector/const_members.wgsl.expected.dxc.hlsl b/test/tint/builtins/frexp/vector/const_members.wgsl.expected.dxc.hlsl
index b3c80eb..78e98c7 100644
--- a/test/tint/builtins/frexp/vector/const_members.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/frexp/vector/const_members.wgsl.expected.dxc.hlsl
@@ -1,12 +1,12 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result_vec2 tint_symbol_1 = {float2(0.625f, 0.9375f), int2(1, 2)};
+  const frexp_result_vec2_f32 tint_symbol_1 = {float2(0.625f, 0.9375f), int2(1, 2)};
   const float2 fract = tint_symbol_1.fract;
-  const frexp_result_vec2 tint_symbol_2 = {float2(0.625f, 0.9375f), int2(1, 2)};
+  const frexp_result_vec2_f32 tint_symbol_2 = {float2(0.625f, 0.9375f), int2(1, 2)};
   const int2 exp = tint_symbol_2.exp;
   return;
 }
diff --git a/test/tint/builtins/frexp/vector/const_members.wgsl.expected.fxc.hlsl b/test/tint/builtins/frexp/vector/const_members.wgsl.expected.fxc.hlsl
index b3c80eb..78e98c7 100644
--- a/test/tint/builtins/frexp/vector/const_members.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/frexp/vector/const_members.wgsl.expected.fxc.hlsl
@@ -1,12 +1,12 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const frexp_result_vec2 tint_symbol_1 = {float2(0.625f, 0.9375f), int2(1, 2)};
+  const frexp_result_vec2_f32 tint_symbol_1 = {float2(0.625f, 0.9375f), int2(1, 2)};
   const float2 fract = tint_symbol_1.fract;
-  const frexp_result_vec2 tint_symbol_2 = {float2(0.625f, 0.9375f), int2(1, 2)};
+  const frexp_result_vec2_f32 tint_symbol_2 = {float2(0.625f, 0.9375f), int2(1, 2)};
   const int2 exp = tint_symbol_2.exp;
   return;
 }
diff --git a/test/tint/builtins/frexp/vector/const_members.wgsl.expected.glsl b/test/tint/builtins/frexp/vector/const_members.wgsl.expected.glsl
index ae073ab..89ca9c4 100644
--- a/test/tint/builtins/frexp/vector/const_members.wgsl.expected.glsl
+++ b/test/tint/builtins/frexp/vector/const_members.wgsl.expected.glsl
@@ -1,15 +1,15 @@
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void tint_symbol() {
-  frexp_result_vec2 tint_symbol_4 = frexp_result_vec2(vec2(0.625f, 0.9375f), ivec2(1, 2));
+  frexp_result_vec2_f32 tint_symbol_4 = frexp_result_vec2_f32(vec2(0.625f, 0.9375f), ivec2(1, 2));
   vec2 tint_symbol_2 = tint_symbol_4.fract;
-  frexp_result_vec2 tint_symbol_5 = frexp_result_vec2(vec2(0.625f, 0.9375f), ivec2(1, 2));
+  frexp_result_vec2_f32 tint_symbol_5 = frexp_result_vec2_f32(vec2(0.625f, 0.9375f), ivec2(1, 2));
   ivec2 tint_symbol_3 = tint_symbol_5.exp;
 }
 
diff --git a/test/tint/builtins/frexp/vector/const_members.wgsl.expected.msl b/test/tint/builtins/frexp/vector/const_members.wgsl.expected.msl
index bf97772..a675b6a 100644
--- a/test/tint/builtins/frexp/vector/const_members.wgsl.expected.msl
+++ b/test/tint/builtins/frexp/vector/const_members.wgsl.expected.msl
@@ -2,14 +2,14 @@
 
 using namespace metal;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 kernel void tint_symbol() {
-  frexp_result_vec2 const tint_symbol_1 = frexp_result_vec2{.fract=float2(0.625f, 0.9375f), .exp=int2(1, 2)};
+  frexp_result_vec2_f32 const tint_symbol_1 = frexp_result_vec2_f32{.fract=float2(0.625f, 0.9375f), .exp=int2(1, 2)};
   float2 const fract = tint_symbol_1.fract;
-  frexp_result_vec2 const tint_symbol_2 = frexp_result_vec2{.fract=float2(0.625f, 0.9375f), .exp=int2(1, 2)};
+  frexp_result_vec2_f32 const tint_symbol_2 = frexp_result_vec2_f32{.fract=float2(0.625f, 0.9375f), .exp=int2(1, 2)};
   int2 const exp = tint_symbol_2.exp;
   return;
 }
diff --git a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.dxc.hlsl b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.dxc.hlsl
index 7d6adb3..1df0445 100644
--- a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.dxc.hlsl
@@ -1,20 +1,20 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
-frexp_result_vec2 tint_frexp(float2 param_0) {
+frexp_result_vec2_f32 tint_frexp(float2 param_0) {
   float2 exp;
   float2 fract = frexp(param_0, exp);
-  frexp_result_vec2 result = {fract, int2(exp)};
+  frexp_result_vec2_f32 result = {fract, int2(exp)};
   return result;
 }
 
 [numthreads(1, 1, 1)]
 void main() {
   const float2 runtime_in = float2(1.25f, 3.75f);
-  frexp_result_vec2 res = {float2(0.625f, 0.9375f), int2(1, 2)};
+  frexp_result_vec2_f32 res = {float2(0.625f, 0.9375f), int2(1, 2)};
   res = tint_frexp(runtime_in);
-  const frexp_result_vec2 c = {float2(0.625f, 0.9375f), int2(1, 2)};
+  const frexp_result_vec2_f32 c = {float2(0.625f, 0.9375f), int2(1, 2)};
   res = c;
   const float2 fract = res.fract;
   const int2 exp = res.exp;
diff --git a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.fxc.hlsl b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.fxc.hlsl
index 7d6adb3..1df0445 100644
--- a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.fxc.hlsl
@@ -1,20 +1,20 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
-frexp_result_vec2 tint_frexp(float2 param_0) {
+frexp_result_vec2_f32 tint_frexp(float2 param_0) {
   float2 exp;
   float2 fract = frexp(param_0, exp);
-  frexp_result_vec2 result = {fract, int2(exp)};
+  frexp_result_vec2_f32 result = {fract, int2(exp)};
   return result;
 }
 
 [numthreads(1, 1, 1)]
 void main() {
   const float2 runtime_in = float2(1.25f, 3.75f);
-  frexp_result_vec2 res = {float2(0.625f, 0.9375f), int2(1, 2)};
+  frexp_result_vec2_f32 res = {float2(0.625f, 0.9375f), int2(1, 2)};
   res = tint_frexp(runtime_in);
-  const frexp_result_vec2 c = {float2(0.625f, 0.9375f), int2(1, 2)};
+  const frexp_result_vec2_f32 c = {float2(0.625f, 0.9375f), int2(1, 2)};
   res = c;
   const float2 fract = res.fract;
   const int2 exp = res.exp;
diff --git a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.glsl b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.glsl
index 82d9710..e4b8d69 100644
--- a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.glsl
+++ b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
-frexp_result_vec2 tint_frexp(vec2 param_0) {
-  frexp_result_vec2 result;
+frexp_result_vec2_f32 tint_frexp(vec2 param_0) {
+  frexp_result_vec2_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -14,9 +14,9 @@
 
 void tint_symbol() {
   vec2 runtime_in = vec2(1.25f, 3.75f);
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.625f, 0.9375f), ivec2(1, 2));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.625f, 0.9375f), ivec2(1, 2));
   res = tint_frexp(runtime_in);
-  res = frexp_result_vec2(vec2(0.625f, 0.9375f), ivec2(1, 2));
+  res = frexp_result_vec2_f32(vec2(0.625f, 0.9375f), ivec2(1, 2));
   vec2 tint_symbol_1 = res.fract;
   ivec2 tint_symbol_2 = res.exp;
 }
diff --git a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.msl b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.msl
index aba51ab..8ef16e9 100644
--- a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.msl
+++ b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.msl
@@ -2,21 +2,21 @@
 
 using namespace metal;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
-frexp_result_vec2 tint_frexp(float2 param_0) {
-  frexp_result_vec2 result;
+frexp_result_vec2_f32 tint_frexp(float2 param_0) {
+  frexp_result_vec2_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
 
 kernel void tint_symbol() {
   float2 const runtime_in = float2(1.25f, 3.75f);
-  frexp_result_vec2 res = frexp_result_vec2{.fract=float2(0.625f, 0.9375f), .exp=int2(1, 2)};
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32{.fract=float2(0.625f, 0.9375f), .exp=int2(1, 2)};
   res = tint_frexp(runtime_in);
-  res = frexp_result_vec2{.fract=float2(0.625f, 0.9375f), .exp=int2(1, 2)};
+  res = frexp_result_vec2_f32{.fract=float2(0.625f, 0.9375f), .exp=int2(1, 2)};
   float2 const fract = res.fract;
   int2 const exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.spvasm b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.spvasm
index 2b45647..03d122e 100644
--- a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.spvasm
+++ b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.spvasm
@@ -9,12 +9,12 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__frexp_result_vec2 "__frexp_result_vec2"
-               OpMemberName %__frexp_result_vec2 0 "fract"
-               OpMemberName %__frexp_result_vec2 1 "exp"
+               OpName %__frexp_result_vec2_f32 "__frexp_result_vec2_f32"
+               OpMemberName %__frexp_result_vec2_f32 0 "fract"
+               OpMemberName %__frexp_result_vec2_f32 1 "exp"
                OpName %res "res"
-               OpMemberDecorate %__frexp_result_vec2 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec2 1 Offset 8
+               OpMemberDecorate %__frexp_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec2_f32 1 Offset 8
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
@@ -24,16 +24,16 @@
           %9 = OpConstantComposite %v2float %float_1_25 %float_3_75
         %int = OpTypeInt 32 1
       %v2int = OpTypeVector %int 2
-%__frexp_result_vec2 = OpTypeStruct %v2float %v2int
+%__frexp_result_vec2_f32 = OpTypeStruct %v2float %v2int
 %float_0_625 = OpConstant %float 0.625
 %float_0_9375 = OpConstant %float 0.9375
          %15 = OpConstantComposite %v2float %float_0_625 %float_0_9375
       %int_1 = OpConstant %int 1
       %int_2 = OpConstant %int 2
          %18 = OpConstantComposite %v2int %int_1 %int_2
-         %19 = OpConstantComposite %__frexp_result_vec2 %15 %18
-%_ptr_Function___frexp_result_vec2 = OpTypePointer Function %__frexp_result_vec2
-         %22 = OpConstantNull %__frexp_result_vec2
+         %19 = OpConstantComposite %__frexp_result_vec2_f32 %15 %18
+%_ptr_Function___frexp_result_vec2_f32 = OpTypePointer Function %__frexp_result_vec2_f32
+         %22 = OpConstantNull %__frexp_result_vec2_f32
        %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
 %_ptr_Function_v2float = OpTypePointer Function %v2float
@@ -41,9 +41,9 @@
 %_ptr_Function_v2int = OpTypePointer Function %v2int
        %main = OpFunction %void None %1
           %4 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result_vec2 Function %22
+        %res = OpVariable %_ptr_Function___frexp_result_vec2_f32 Function %22
                OpStore %res %19
-         %23 = OpExtInst %__frexp_result_vec2 %24 FrexpStruct %9
+         %23 = OpExtInst %__frexp_result_vec2_f32 %24 FrexpStruct %9
                OpStore %res %23
                OpStore %res %19
          %28 = OpAccessChain %_ptr_Function_v2float %res %uint_0
diff --git a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.dxc.hlsl b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.dxc.hlsl
index ea744b6..a6b9fed 100644
--- a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.dxc.hlsl
@@ -1,18 +1,18 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
-frexp_result_vec2 tint_frexp(float2 param_0) {
+frexp_result_vec2_f32 tint_frexp(float2 param_0) {
   float2 exp;
   float2 fract = frexp(param_0, exp);
-  frexp_result_vec2 result = {fract, int2(exp)};
+  frexp_result_vec2_f32 result = {fract, int2(exp)};
   return result;
 }
 
 [numthreads(1, 1, 1)]
 void main() {
   const float2 tint_symbol = float2(1.25f, 3.75f);
-  const frexp_result_vec2 res = tint_frexp(tint_symbol);
+  const frexp_result_vec2_f32 res = tint_frexp(tint_symbol);
   const float2 fract = res.fract;
   const int2 exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.fxc.hlsl b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.fxc.hlsl
index ea744b6..a6b9fed 100644
--- a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.fxc.hlsl
@@ -1,18 +1,18 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
-frexp_result_vec2 tint_frexp(float2 param_0) {
+frexp_result_vec2_f32 tint_frexp(float2 param_0) {
   float2 exp;
   float2 fract = frexp(param_0, exp);
-  frexp_result_vec2 result = {fract, int2(exp)};
+  frexp_result_vec2_f32 result = {fract, int2(exp)};
   return result;
 }
 
 [numthreads(1, 1, 1)]
 void main() {
   const float2 tint_symbol = float2(1.25f, 3.75f);
-  const frexp_result_vec2 res = tint_frexp(tint_symbol);
+  const frexp_result_vec2_f32 res = tint_frexp(tint_symbol);
   const float2 fract = res.fract;
   const int2 exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.glsl b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.glsl
index ded971f..ea79334 100644
--- a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.glsl
+++ b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
-frexp_result_vec2 tint_frexp(vec2 param_0) {
-  frexp_result_vec2 result;
+frexp_result_vec2_f32 tint_frexp(vec2 param_0) {
+  frexp_result_vec2_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void tint_symbol() {
   vec2 tint_symbol_1 = vec2(1.25f, 3.75f);
-  frexp_result_vec2 res = tint_frexp(tint_symbol_1);
+  frexp_result_vec2_f32 res = tint_frexp(tint_symbol_1);
   vec2 tint_symbol_2 = res.fract;
   ivec2 tint_symbol_3 = res.exp;
 }
diff --git a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.msl b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.msl
index 30cf6cc..9a7c0b0 100644
--- a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.msl
+++ b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
-frexp_result_vec2 tint_frexp(float2 param_0) {
-  frexp_result_vec2 result;
+frexp_result_vec2_f32 tint_frexp(float2 param_0) {
+  frexp_result_vec2_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
 
 kernel void tint_symbol() {
   float2 const in = float2(1.25f, 3.75f);
-  frexp_result_vec2 const res = tint_frexp(in);
+  frexp_result_vec2_f32 const res = tint_frexp(in);
   float2 const fract = res.fract;
   int2 const exp = res.exp;
   return;
diff --git a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.spvasm b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.spvasm
index 8541b98..de801da 100644
--- a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.spvasm
+++ b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.spvasm
@@ -9,11 +9,11 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__frexp_result_vec2 "__frexp_result_vec2"
-               OpMemberName %__frexp_result_vec2 0 "fract"
-               OpMemberName %__frexp_result_vec2 1 "exp"
-               OpMemberDecorate %__frexp_result_vec2 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec2 1 Offset 8
+               OpName %__frexp_result_vec2_f32 "__frexp_result_vec2_f32"
+               OpMemberName %__frexp_result_vec2_f32 0 "fract"
+               OpMemberName %__frexp_result_vec2_f32 1 "exp"
+               OpMemberDecorate %__frexp_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec2_f32 1 Offset 8
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
@@ -23,10 +23,10 @@
           %9 = OpConstantComposite %v2float %float_1_25 %float_3_75
         %int = OpTypeInt 32 1
       %v2int = OpTypeVector %int 2
-%__frexp_result_vec2 = OpTypeStruct %v2float %v2int
+%__frexp_result_vec2_f32 = OpTypeStruct %v2float %v2int
        %main = OpFunction %void None %1
           %4 = OpLabel
-         %10 = OpExtInst %__frexp_result_vec2 %14 FrexpStruct %9
+         %10 = OpExtInst %__frexp_result_vec2_f32 %14 FrexpStruct %9
          %15 = OpCompositeExtract %v2float %10 0
          %16 = OpCompositeExtract %v2int %10 1
                OpReturn
diff --git a/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.dxc.hlsl
index f0571de..62d50ee 100644
--- a/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
 void frexp_34bbfb() {
-  frexp_result_vec4 res = {(0.5f).xxxx, (1).xxxx};
+  frexp_result_vec4_f32 res = {(0.5f).xxxx, (1).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.fxc.hlsl
index f0571de..62d50ee 100644
--- a/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
 void frexp_34bbfb() {
-  frexp_result_vec4 res = {(0.5f).xxxx, (1).xxxx};
+  frexp_result_vec4_f32 res = {(0.5f).xxxx, (1).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.glsl
index b05fb00..f573f2f 100644
--- a/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
 
 void frexp_34bbfb() {
-  frexp_result_vec4 res = frexp_result_vec4(vec4(0.5f), ivec4(1));
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32(vec4(0.5f), ivec4(1));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
 
 void frexp_34bbfb() {
-  frexp_result_vec4 res = frexp_result_vec4(vec4(0.5f), ivec4(1));
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32(vec4(0.5f), ivec4(1));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
 
 void frexp_34bbfb() {
-  frexp_result_vec4 res = frexp_result_vec4(vec4(0.5f), ivec4(1));
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32(vec4(0.5f), ivec4(1));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.msl
index 1a5b652..d1b897f 100644
--- a/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
 void frexp_34bbfb() {
-  frexp_result_vec4 res = frexp_result_vec4{.fract=float4(0.5f), .exp=int4(1)};
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32{.fract=float4(0.5f), .exp=int4(1)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.spvasm
index 146a713..26cb2f2 100644
--- a/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/frexp/34bbfb.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_34bbfb "frexp_34bbfb"
-               OpName %__frexp_result_vec4 "__frexp_result_vec4"
-               OpMemberName %__frexp_result_vec4 0 "fract"
-               OpMemberName %__frexp_result_vec4 1 "exp"
+               OpName %__frexp_result_vec4_f32 "__frexp_result_vec4_f32"
+               OpMemberName %__frexp_result_vec4_f32 0 "fract"
+               OpMemberName %__frexp_result_vec4_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec4 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec4 1 Offset 16
+               OpMemberDecorate %__frexp_result_vec4_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec4_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -37,19 +37,19 @@
           %9 = OpTypeFunction %void
         %int = OpTypeInt 32 1
       %v4int = OpTypeVector %int 4
-%__frexp_result_vec4 = OpTypeStruct %v4float %v4int
+%__frexp_result_vec4_f32 = OpTypeStruct %v4float %v4int
   %float_0_5 = OpConstant %float 0.5
          %17 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
       %int_1 = OpConstant %int 1
          %19 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
-         %20 = OpConstantComposite %__frexp_result_vec4 %17 %19
-%_ptr_Function___frexp_result_vec4 = OpTypePointer Function %__frexp_result_vec4
-         %23 = OpConstantNull %__frexp_result_vec4
+         %20 = OpConstantComposite %__frexp_result_vec4_f32 %17 %19
+%_ptr_Function___frexp_result_vec4_f32 = OpTypePointer Function %__frexp_result_vec4_f32
+         %23 = OpConstantNull %__frexp_result_vec4_f32
          %24 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_34bbfb = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result_vec4 Function %23
+        %res = OpVariable %_ptr_Function___frexp_result_vec4_f32 Function %23
                OpStore %res %20
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.dxc.hlsl
index 31de0eb..201be57 100644
--- a/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 void frexp_4b2200() {
-  frexp_result res = {0.5f, 1};
+  frexp_result_f32 res = {0.5f, 1};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.fxc.hlsl
index 31de0eb..201be57 100644
--- a/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 void frexp_4b2200() {
-  frexp_result res = {0.5f, 1};
+  frexp_result_f32 res = {0.5f, 1};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.glsl
index f5a158d..bfccbad 100644
--- a/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void frexp_4b2200() {
-  frexp_result res = frexp_result(0.5f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.5f, 1);
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void frexp_4b2200() {
-  frexp_result res = frexp_result(0.5f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.5f, 1);
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void frexp_4b2200() {
-  frexp_result res = frexp_result(0.5f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.5f, 1);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.msl
index 1fa65d3..06a7cdc 100644
--- a/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 void frexp_4b2200() {
-  frexp_result res = frexp_result{.fract=0.5f, .exp=1};
+  frexp_result_f32 res = frexp_result_f32{.fract=0.5f, .exp=1};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.spvasm
index 2b4eb35..bf49b67 100644
--- a/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/frexp/4b2200.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_4b2200 "frexp_4b2200"
-               OpName %__frexp_result "__frexp_result"
-               OpMemberName %__frexp_result 0 "fract"
-               OpMemberName %__frexp_result 1 "exp"
+               OpName %__frexp_result_f32 "__frexp_result_f32"
+               OpMemberName %__frexp_result_f32 0 "fract"
+               OpMemberName %__frexp_result_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result 0 Offset 0
-               OpMemberDecorate %__frexp_result 1 Offset 4
+               OpMemberDecorate %__frexp_result_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_f32 1 Offset 4
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -36,17 +36,17 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
         %int = OpTypeInt 32 1
-%__frexp_result = OpTypeStruct %float %int
+%__frexp_result_f32 = OpTypeStruct %float %int
   %float_0_5 = OpConstant %float 0.5
       %int_1 = OpConstant %int 1
-         %17 = OpConstantComposite %__frexp_result %float_0_5 %int_1
-%_ptr_Function___frexp_result = OpTypePointer Function %__frexp_result
-         %20 = OpConstantNull %__frexp_result
+         %17 = OpConstantComposite %__frexp_result_f32 %float_0_5 %int_1
+%_ptr_Function___frexp_result_f32 = OpTypePointer Function %__frexp_result_f32
+         %20 = OpConstantNull %__frexp_result_f32
          %21 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_4b2200 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result Function %20
+        %res = OpVariable %_ptr_Function___frexp_result_f32 Function %20
                OpStore %res %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.dxc.hlsl
index cc4ff35..f867068 100644
--- a/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = {(0.5f).xx, (1).xx};
+  frexp_result_vec2_f32 res = {(0.5f).xx, (1).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.fxc.hlsl
index cc4ff35..f867068 100644
--- a/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = {(0.5f).xx, (1).xx};
+  frexp_result_vec2_f32 res = {(0.5f).xx, (1).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.glsl
index e5ecc96..0887713 100644
--- a/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.5f), ivec2(1));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.5f), ivec2(1));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.5f), ivec2(1));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.msl
index 5356433..52c3d8e 100644
--- a/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = frexp_result_vec2{.fract=float2(0.5f), .exp=int2(1)};
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32{.fract=float2(0.5f), .exp=int2(1)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.spvasm
index 1d03915..675198b 100644
--- a/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/frexp/6fb3ad.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_6fb3ad "frexp_6fb3ad"
-               OpName %__frexp_result_vec2 "__frexp_result_vec2"
-               OpMemberName %__frexp_result_vec2 0 "fract"
-               OpMemberName %__frexp_result_vec2 1 "exp"
+               OpName %__frexp_result_vec2_f32 "__frexp_result_vec2_f32"
+               OpMemberName %__frexp_result_vec2_f32 0 "fract"
+               OpMemberName %__frexp_result_vec2_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec2 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec2 1 Offset 8
+               OpMemberDecorate %__frexp_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec2_f32 1 Offset 8
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -38,19 +38,19 @@
     %v2float = OpTypeVector %float 2
         %int = OpTypeInt 32 1
       %v2int = OpTypeVector %int 2
-%__frexp_result_vec2 = OpTypeStruct %v2float %v2int
+%__frexp_result_vec2_f32 = OpTypeStruct %v2float %v2int
   %float_0_5 = OpConstant %float 0.5
          %18 = OpConstantComposite %v2float %float_0_5 %float_0_5
       %int_1 = OpConstant %int 1
          %20 = OpConstantComposite %v2int %int_1 %int_1
-         %21 = OpConstantComposite %__frexp_result_vec2 %18 %20
-%_ptr_Function___frexp_result_vec2 = OpTypePointer Function %__frexp_result_vec2
-         %24 = OpConstantNull %__frexp_result_vec2
+         %21 = OpConstantComposite %__frexp_result_vec2_f32 %18 %20
+%_ptr_Function___frexp_result_vec2_f32 = OpTypePointer Function %__frexp_result_vec2_f32
+         %24 = OpConstantNull %__frexp_result_vec2_f32
          %25 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_6fb3ad = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result_vec2 Function %24
+        %res = OpVariable %_ptr_Function___frexp_result_vec2_f32 Function %24
                OpStore %res %21
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.dxc.hlsl
index 9305a1e..bcace82 100644
--- a/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
 void frexp_77af93() {
-  frexp_result_vec4 res = {(0.5f).xxxx, (1).xxxx};
+  frexp_result_vec4_f32 res = {(0.5f).xxxx, (1).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.fxc.hlsl
index 9305a1e..bcace82 100644
--- a/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
 void frexp_77af93() {
-  frexp_result_vec4 res = {(0.5f).xxxx, (1).xxxx};
+  frexp_result_vec4_f32 res = {(0.5f).xxxx, (1).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.glsl
index 5361fab..ba3cc93 100644
--- a/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
 
 void frexp_77af93() {
-  frexp_result_vec4 res = frexp_result_vec4(vec4(0.5f), ivec4(1));
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32(vec4(0.5f), ivec4(1));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
 
 void frexp_77af93() {
-  frexp_result_vec4 res = frexp_result_vec4(vec4(0.5f), ivec4(1));
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32(vec4(0.5f), ivec4(1));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
 
 void frexp_77af93() {
-  frexp_result_vec4 res = frexp_result_vec4(vec4(0.5f), ivec4(1));
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32(vec4(0.5f), ivec4(1));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.msl
index 448b118..35545ad 100644
--- a/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
 void frexp_77af93() {
-  frexp_result_vec4 res = frexp_result_vec4{.fract=float4(0.5f), .exp=int4(1)};
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32{.fract=float4(0.5f), .exp=int4(1)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.spvasm
index 5ee2467..7de03a5 100644
--- a/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/frexp/77af93.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_77af93 "frexp_77af93"
-               OpName %__frexp_result_vec4 "__frexp_result_vec4"
-               OpMemberName %__frexp_result_vec4 0 "fract"
-               OpMemberName %__frexp_result_vec4 1 "exp"
+               OpName %__frexp_result_vec4_f32 "__frexp_result_vec4_f32"
+               OpMemberName %__frexp_result_vec4_f32 0 "fract"
+               OpMemberName %__frexp_result_vec4_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec4 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec4 1 Offset 16
+               OpMemberDecorate %__frexp_result_vec4_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec4_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -37,19 +37,19 @@
           %9 = OpTypeFunction %void
         %int = OpTypeInt 32 1
       %v4int = OpTypeVector %int 4
-%__frexp_result_vec4 = OpTypeStruct %v4float %v4int
+%__frexp_result_vec4_f32 = OpTypeStruct %v4float %v4int
   %float_0_5 = OpConstant %float 0.5
          %17 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
       %int_1 = OpConstant %int 1
          %19 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
-         %20 = OpConstantComposite %__frexp_result_vec4 %17 %19
-%_ptr_Function___frexp_result_vec4 = OpTypePointer Function %__frexp_result_vec4
-         %23 = OpConstantNull %__frexp_result_vec4
+         %20 = OpConstantComposite %__frexp_result_vec4_f32 %17 %19
+%_ptr_Function___frexp_result_vec4_f32 = OpTypePointer Function %__frexp_result_vec4_f32
+         %23 = OpConstantNull %__frexp_result_vec4_f32
          %24 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_77af93 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result_vec4 Function %23
+        %res = OpVariable %_ptr_Function___frexp_result_vec4_f32 Function %23
                OpStore %res %20
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.dxc.hlsl
index 3952e5e..44e7f56 100644
--- a/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 void frexp_979800() {
-  frexp_result_vec3 res = {(0.5f).xxx, (1).xxx};
+  frexp_result_vec3_f32 res = {(0.5f).xxx, (1).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.fxc.hlsl
index 3952e5e..44e7f56 100644
--- a/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 void frexp_979800() {
-  frexp_result_vec3 res = {(0.5f).xxx, (1).xxx};
+  frexp_result_vec3_f32 res = {(0.5f).xxx, (1).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.glsl
index 0e99f61..cb84565 100644
--- a/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
 
 void frexp_979800() {
-  frexp_result_vec3 res = frexp_result_vec3(vec3(0.5f), ivec3(1));
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32(vec3(0.5f), ivec3(1));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
 
 void frexp_979800() {
-  frexp_result_vec3 res = frexp_result_vec3(vec3(0.5f), ivec3(1));
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32(vec3(0.5f), ivec3(1));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
 
 void frexp_979800() {
-  frexp_result_vec3 res = frexp_result_vec3(vec3(0.5f), ivec3(1));
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32(vec3(0.5f), ivec3(1));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.msl
index 5dbe0f6..713fcbd 100644
--- a/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 void frexp_979800() {
-  frexp_result_vec3 res = frexp_result_vec3{.fract=float3(0.5f), .exp=int3(1)};
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32{.fract=float3(0.5f), .exp=int3(1)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.spvasm
index 82afd21..f39e8f9 100644
--- a/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/frexp/979800.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_979800 "frexp_979800"
-               OpName %__frexp_result_vec3 "__frexp_result_vec3"
-               OpMemberName %__frexp_result_vec3 0 "fract"
-               OpMemberName %__frexp_result_vec3 1 "exp"
+               OpName %__frexp_result_vec3_f32 "__frexp_result_vec3_f32"
+               OpMemberName %__frexp_result_vec3_f32 0 "fract"
+               OpMemberName %__frexp_result_vec3_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec3 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec3 1 Offset 16
+               OpMemberDecorate %__frexp_result_vec3_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec3_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -38,19 +38,19 @@
     %v3float = OpTypeVector %float 3
         %int = OpTypeInt 32 1
       %v3int = OpTypeVector %int 3
-%__frexp_result_vec3 = OpTypeStruct %v3float %v3int
+%__frexp_result_vec3_f32 = OpTypeStruct %v3float %v3int
   %float_0_5 = OpConstant %float 0.5
          %18 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5
       %int_1 = OpConstant %int 1
          %20 = OpConstantComposite %v3int %int_1 %int_1 %int_1
-         %21 = OpConstantComposite %__frexp_result_vec3 %18 %20
-%_ptr_Function___frexp_result_vec3 = OpTypePointer Function %__frexp_result_vec3
-         %24 = OpConstantNull %__frexp_result_vec3
+         %21 = OpConstantComposite %__frexp_result_vec3_f32 %18 %20
+%_ptr_Function___frexp_result_vec3_f32 = OpTypePointer Function %__frexp_result_vec3_f32
+         %24 = OpConstantNull %__frexp_result_vec3_f32
          %25 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_979800 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result_vec3 Function %24
+        %res = OpVariable %_ptr_Function___frexp_result_vec3_f32 Function %24
                OpStore %res %21
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.dxc.hlsl
index efbe069..567f391 100644
--- a/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 void frexp_bee870() {
-  frexp_result res = {0.5f, 1};
+  frexp_result_f32 res = {0.5f, 1};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.fxc.hlsl
index efbe069..567f391 100644
--- a/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 void frexp_bee870() {
-  frexp_result res = {0.5f, 1};
+  frexp_result_f32 res = {0.5f, 1};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.glsl
index 0e94ee2..2f47c25 100644
--- a/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void frexp_bee870() {
-  frexp_result res = frexp_result(0.5f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.5f, 1);
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void frexp_bee870() {
-  frexp_result res = frexp_result(0.5f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.5f, 1);
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void frexp_bee870() {
-  frexp_result res = frexp_result(0.5f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.5f, 1);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.msl
index 8c2107d..8579dce 100644
--- a/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 void frexp_bee870() {
-  frexp_result res = frexp_result{.fract=0.5f, .exp=1};
+  frexp_result_f32 res = frexp_result_f32{.fract=0.5f, .exp=1};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.spvasm
index b2675a6..673d3be 100644
--- a/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/frexp/bee870.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_bee870 "frexp_bee870"
-               OpName %__frexp_result "__frexp_result"
-               OpMemberName %__frexp_result 0 "fract"
-               OpMemberName %__frexp_result 1 "exp"
+               OpName %__frexp_result_f32 "__frexp_result_f32"
+               OpMemberName %__frexp_result_f32 0 "fract"
+               OpMemberName %__frexp_result_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result 0 Offset 0
-               OpMemberDecorate %__frexp_result 1 Offset 4
+               OpMemberDecorate %__frexp_result_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_f32 1 Offset 4
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -36,17 +36,17 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
         %int = OpTypeInt 32 1
-%__frexp_result = OpTypeStruct %float %int
+%__frexp_result_f32 = OpTypeStruct %float %int
   %float_0_5 = OpConstant %float 0.5
       %int_1 = OpConstant %int 1
-         %17 = OpConstantComposite %__frexp_result %float_0_5 %int_1
-%_ptr_Function___frexp_result = OpTypePointer Function %__frexp_result
-         %20 = OpConstantNull %__frexp_result
+         %17 = OpConstantComposite %__frexp_result_f32 %float_0_5 %int_1
+%_ptr_Function___frexp_result_f32 = OpTypePointer Function %__frexp_result_f32
+         %20 = OpConstantNull %__frexp_result_f32
          %21 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_bee870 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result Function %20
+        %res = OpVariable %_ptr_Function___frexp_result_f32 Function %20
                OpStore %res %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.dxc.hlsl
index c896f2b..daf958c 100644
--- a/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 void frexp_bf45ae() {
-  frexp_result_vec3 res = {(0.5f).xxx, (1).xxx};
+  frexp_result_vec3_f32 res = {(0.5f).xxx, (1).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.fxc.hlsl
index c896f2b..daf958c 100644
--- a/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 void frexp_bf45ae() {
-  frexp_result_vec3 res = {(0.5f).xxx, (1).xxx};
+  frexp_result_vec3_f32 res = {(0.5f).xxx, (1).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.glsl
index f7f382e..9ced10b 100644
--- a/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
 
 void frexp_bf45ae() {
-  frexp_result_vec3 res = frexp_result_vec3(vec3(0.5f), ivec3(1));
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32(vec3(0.5f), ivec3(1));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
 
 void frexp_bf45ae() {
-  frexp_result_vec3 res = frexp_result_vec3(vec3(0.5f), ivec3(1));
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32(vec3(0.5f), ivec3(1));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
 
 void frexp_bf45ae() {
-  frexp_result_vec3 res = frexp_result_vec3(vec3(0.5f), ivec3(1));
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32(vec3(0.5f), ivec3(1));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.msl
index 6bbab11..5609679 100644
--- a/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 void frexp_bf45ae() {
-  frexp_result_vec3 res = frexp_result_vec3{.fract=float3(0.5f), .exp=int3(1)};
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32{.fract=float3(0.5f), .exp=int3(1)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.spvasm
index 28459bc..92959a2 100644
--- a/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/frexp/bf45ae.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_bf45ae "frexp_bf45ae"
-               OpName %__frexp_result_vec3 "__frexp_result_vec3"
-               OpMemberName %__frexp_result_vec3 0 "fract"
-               OpMemberName %__frexp_result_vec3 1 "exp"
+               OpName %__frexp_result_vec3_f32 "__frexp_result_vec3_f32"
+               OpMemberName %__frexp_result_vec3_f32 0 "fract"
+               OpMemberName %__frexp_result_vec3_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec3 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec3 1 Offset 16
+               OpMemberDecorate %__frexp_result_vec3_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec3_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -38,19 +38,19 @@
     %v3float = OpTypeVector %float 3
         %int = OpTypeInt 32 1
       %v3int = OpTypeVector %int 3
-%__frexp_result_vec3 = OpTypeStruct %v3float %v3int
+%__frexp_result_vec3_f32 = OpTypeStruct %v3float %v3int
   %float_0_5 = OpConstant %float 0.5
          %18 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5
       %int_1 = OpConstant %int 1
          %20 = OpConstantComposite %v3int %int_1 %int_1 %int_1
-         %21 = OpConstantComposite %__frexp_result_vec3 %18 %20
-%_ptr_Function___frexp_result_vec3 = OpTypePointer Function %__frexp_result_vec3
-         %24 = OpConstantNull %__frexp_result_vec3
+         %21 = OpConstantComposite %__frexp_result_vec3_f32 %18 %20
+%_ptr_Function___frexp_result_vec3_f32 = OpTypePointer Function %__frexp_result_vec3_f32
+         %24 = OpConstantNull %__frexp_result_vec3_f32
          %25 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_bf45ae = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result_vec3 Function %24
+        %res = OpVariable %_ptr_Function___frexp_result_vec3_f32 Function %24
                OpStore %res %21
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.dxc.hlsl
index f0e207c..43f2781 100644
--- a/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 void frexp_eb2421() {
-  frexp_result_vec2 res = {(0.5f).xx, (1).xx};
+  frexp_result_vec2_f32 res = {(0.5f).xx, (1).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.fxc.hlsl
index f0e207c..43f2781 100644
--- a/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 void frexp_eb2421() {
-  frexp_result_vec2 res = {(0.5f).xx, (1).xx};
+  frexp_result_vec2_f32 res = {(0.5f).xx, (1).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.glsl b/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.glsl
index 0495b8a..21fc8ed 100644
--- a/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void frexp_eb2421() {
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.5f), ivec2(1));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void frexp_eb2421() {
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.5f), ivec2(1));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void frexp_eb2421() {
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.5f), ivec2(1));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.msl b/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.msl
index d920b46..af33e5d0 100644
--- a/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 void frexp_eb2421() {
-  frexp_result_vec2 res = frexp_result_vec2{.fract=float2(0.5f), .exp=int2(1)};
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32{.fract=float2(0.5f), .exp=int2(1)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.spvasm
index 29a8679..8f167ca 100644
--- a/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/frexp/eb2421.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_eb2421 "frexp_eb2421"
-               OpName %__frexp_result_vec2 "__frexp_result_vec2"
-               OpMemberName %__frexp_result_vec2 0 "fract"
-               OpMemberName %__frexp_result_vec2 1 "exp"
+               OpName %__frexp_result_vec2_f32 "__frexp_result_vec2_f32"
+               OpMemberName %__frexp_result_vec2_f32 0 "fract"
+               OpMemberName %__frexp_result_vec2_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec2 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec2 1 Offset 8
+               OpMemberDecorate %__frexp_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec2_f32 1 Offset 8
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -38,19 +38,19 @@
     %v2float = OpTypeVector %float 2
         %int = OpTypeInt 32 1
       %v2int = OpTypeVector %int 2
-%__frexp_result_vec2 = OpTypeStruct %v2float %v2int
+%__frexp_result_vec2_f32 = OpTypeStruct %v2float %v2int
   %float_0_5 = OpConstant %float 0.5
          %18 = OpConstantComposite %v2float %float_0_5 %float_0_5
       %int_1 = OpConstant %int 1
          %20 = OpConstantComposite %v2int %int_1 %int_1
-         %21 = OpConstantComposite %__frexp_result_vec2 %18 %20
-%_ptr_Function___frexp_result_vec2 = OpTypePointer Function %__frexp_result_vec2
-         %24 = OpConstantNull %__frexp_result_vec2
+         %21 = OpConstantComposite %__frexp_result_vec2_f32 %18 %20
+%_ptr_Function___frexp_result_vec2_f32 = OpTypePointer Function %__frexp_result_vec2_f32
+         %24 = OpConstantNull %__frexp_result_vec2_f32
          %25 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_eb2421 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result_vec2 Function %24
+        %res = OpVariable %_ptr_Function___frexp_result_vec2_f32 Function %24
                OpStore %res %21
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.dxc.hlsl
index 0dc03d8..316bb69 100644
--- a/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 void modf_2d50da() {
-  modf_result_vec2 res = {(-0.5f).xx, (-1.0f).xx};
+  modf_result_vec2_f32 res = {(-0.5f).xx, (-1.0f).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.fxc.hlsl
index 0dc03d8..316bb69 100644
--- a/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 void modf_2d50da() {
-  modf_result_vec2 res = {(-0.5f).xx, (-1.0f).xx};
+  modf_result_vec2_f32 res = {(-0.5f).xx, (-1.0f).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.glsl
index 881c541..630bea9 100644
--- a/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void modf_2d50da() {
-  modf_result_vec2 res = modf_result_vec2(vec2(-0.5f), vec2(-1.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(-0.5f), vec2(-1.0f));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void modf_2d50da() {
-  modf_result_vec2 res = modf_result_vec2(vec2(-0.5f), vec2(-1.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(-0.5f), vec2(-1.0f));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void modf_2d50da() {
-  modf_result_vec2 res = modf_result_vec2(vec2(-0.5f), vec2(-1.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(-0.5f), vec2(-1.0f));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.msl
index 16a1941..406b30d 100644
--- a/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 void modf_2d50da() {
-  modf_result_vec2 res = modf_result_vec2{.fract=float2(-0.5f), .whole=float2(-1.0f)};
+  modf_result_vec2_f32 res = modf_result_vec2_f32{.fract=float2(-0.5f), .whole=float2(-1.0f)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.spvasm
index 84f1689..155cb7c 100644
--- a/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/modf/2d50da.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_2d50da "modf_2d50da"
-               OpName %__modf_result_vec2 "__modf_result_vec2"
-               OpMemberName %__modf_result_vec2 0 "fract"
-               OpMemberName %__modf_result_vec2 1 "whole"
+               OpName %__modf_result_vec2_f32 "__modf_result_vec2_f32"
+               OpMemberName %__modf_result_vec2_f32 0 "fract"
+               OpMemberName %__modf_result_vec2_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec2 0 Offset 0
-               OpMemberDecorate %__modf_result_vec2 1 Offset 8
+               OpMemberDecorate %__modf_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec2_f32 1 Offset 8
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -36,19 +36,19 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
     %v2float = OpTypeVector %float 2
-%__modf_result_vec2 = OpTypeStruct %v2float %v2float
+%__modf_result_vec2_f32 = OpTypeStruct %v2float %v2float
  %float_n0_5 = OpConstant %float -0.5
          %16 = OpConstantComposite %v2float %float_n0_5 %float_n0_5
    %float_n1 = OpConstant %float -1
          %18 = OpConstantComposite %v2float %float_n1 %float_n1
-         %19 = OpConstantComposite %__modf_result_vec2 %16 %18
-%_ptr_Function___modf_result_vec2 = OpTypePointer Function %__modf_result_vec2
-         %22 = OpConstantNull %__modf_result_vec2
+         %19 = OpConstantComposite %__modf_result_vec2_f32 %16 %18
+%_ptr_Function___modf_result_vec2_f32 = OpTypePointer Function %__modf_result_vec2_f32
+         %22 = OpConstantNull %__modf_result_vec2_f32
          %23 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_2d50da = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result_vec2 Function %22
+        %res = OpVariable %_ptr_Function___modf_result_vec2_f32 Function %22
                OpStore %res %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.dxc.hlsl
index deca14c..c2828b5 100644
--- a/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
 void modf_4bfced() {
-  modf_result_vec4 res = {(-0.5f).xxxx, (-1.0f).xxxx};
+  modf_result_vec4_f32 res = {(-0.5f).xxxx, (-1.0f).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.fxc.hlsl
index deca14c..c2828b5 100644
--- a/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
 void modf_4bfced() {
-  modf_result_vec4 res = {(-0.5f).xxxx, (-1.0f).xxxx};
+  modf_result_vec4_f32 res = {(-0.5f).xxxx, (-1.0f).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.glsl
index 6952a13..be50434 100644
--- a/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
 
 void modf_4bfced() {
-  modf_result_vec4 res = modf_result_vec4(vec4(-0.5f), vec4(-1.0f));
+  modf_result_vec4_f32 res = modf_result_vec4_f32(vec4(-0.5f), vec4(-1.0f));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
 
 void modf_4bfced() {
-  modf_result_vec4 res = modf_result_vec4(vec4(-0.5f), vec4(-1.0f));
+  modf_result_vec4_f32 res = modf_result_vec4_f32(vec4(-0.5f), vec4(-1.0f));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
 
 void modf_4bfced() {
-  modf_result_vec4 res = modf_result_vec4(vec4(-0.5f), vec4(-1.0f));
+  modf_result_vec4_f32 res = modf_result_vec4_f32(vec4(-0.5f), vec4(-1.0f));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.msl
index 9b97487..b2162b8 100644
--- a/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
 void modf_4bfced() {
-  modf_result_vec4 res = modf_result_vec4{.fract=float4(-0.5f), .whole=float4(-1.0f)};
+  modf_result_vec4_f32 res = modf_result_vec4_f32{.fract=float4(-0.5f), .whole=float4(-1.0f)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.spvasm
index 60d2fc2..d1271ad 100644
--- a/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/modf/4bfced.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_4bfced "modf_4bfced"
-               OpName %__modf_result_vec4 "__modf_result_vec4"
-               OpMemberName %__modf_result_vec4 0 "fract"
-               OpMemberName %__modf_result_vec4 1 "whole"
+               OpName %__modf_result_vec4_f32 "__modf_result_vec4_f32"
+               OpMemberName %__modf_result_vec4_f32 0 "fract"
+               OpMemberName %__modf_result_vec4_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec4 0 Offset 0
-               OpMemberDecorate %__modf_result_vec4 1 Offset 16
+               OpMemberDecorate %__modf_result_vec4_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec4_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -35,19 +35,19 @@
 %vertex_point_size = OpVariable %_ptr_Output_float Output %8
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
-%__modf_result_vec4 = OpTypeStruct %v4float %v4float
+%__modf_result_vec4_f32 = OpTypeStruct %v4float %v4float
  %float_n0_5 = OpConstant %float -0.5
          %15 = OpConstantComposite %v4float %float_n0_5 %float_n0_5 %float_n0_5 %float_n0_5
    %float_n1 = OpConstant %float -1
          %17 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1
-         %18 = OpConstantComposite %__modf_result_vec4 %15 %17
-%_ptr_Function___modf_result_vec4 = OpTypePointer Function %__modf_result_vec4
-         %21 = OpConstantNull %__modf_result_vec4
+         %18 = OpConstantComposite %__modf_result_vec4_f32 %15 %17
+%_ptr_Function___modf_result_vec4_f32 = OpTypePointer Function %__modf_result_vec4_f32
+         %21 = OpConstantNull %__modf_result_vec4_f32
          %22 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_4bfced = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result_vec4 Function %21
+        %res = OpVariable %_ptr_Function___modf_result_vec4_f32 Function %21
                OpStore %res %18
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.dxc.hlsl
index e594903..7ed4e6e 100644
--- a/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 void modf_5ea256() {
-  modf_result_vec3 res = {(-0.5f).xxx, (-1.0f).xxx};
+  modf_result_vec3_f32 res = {(-0.5f).xxx, (-1.0f).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.fxc.hlsl
index e594903..7ed4e6e 100644
--- a/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 void modf_5ea256() {
-  modf_result_vec3 res = {(-0.5f).xxx, (-1.0f).xxx};
+  modf_result_vec3_f32 res = {(-0.5f).xxx, (-1.0f).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.glsl
index 84138c0..aa3a712 100644
--- a/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
 
 void modf_5ea256() {
-  modf_result_vec3 res = modf_result_vec3(vec3(-0.5f), vec3(-1.0f));
+  modf_result_vec3_f32 res = modf_result_vec3_f32(vec3(-0.5f), vec3(-1.0f));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
 
 void modf_5ea256() {
-  modf_result_vec3 res = modf_result_vec3(vec3(-0.5f), vec3(-1.0f));
+  modf_result_vec3_f32 res = modf_result_vec3_f32(vec3(-0.5f), vec3(-1.0f));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
 
 void modf_5ea256() {
-  modf_result_vec3 res = modf_result_vec3(vec3(-0.5f), vec3(-1.0f));
+  modf_result_vec3_f32 res = modf_result_vec3_f32(vec3(-0.5f), vec3(-1.0f));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.msl
index 4e73398..758efe7 100644
--- a/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 void modf_5ea256() {
-  modf_result_vec3 res = modf_result_vec3{.fract=float3(-0.5f), .whole=float3(-1.0f)};
+  modf_result_vec3_f32 res = modf_result_vec3_f32{.fract=float3(-0.5f), .whole=float3(-1.0f)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.spvasm
index 62e6d32..57769ae 100644
--- a/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/modf/5ea256.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_5ea256 "modf_5ea256"
-               OpName %__modf_result_vec3 "__modf_result_vec3"
-               OpMemberName %__modf_result_vec3 0 "fract"
-               OpMemberName %__modf_result_vec3 1 "whole"
+               OpName %__modf_result_vec3_f32 "__modf_result_vec3_f32"
+               OpMemberName %__modf_result_vec3_f32 0 "fract"
+               OpMemberName %__modf_result_vec3_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec3 0 Offset 0
-               OpMemberDecorate %__modf_result_vec3 1 Offset 16
+               OpMemberDecorate %__modf_result_vec3_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec3_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -36,19 +36,19 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
     %v3float = OpTypeVector %float 3
-%__modf_result_vec3 = OpTypeStruct %v3float %v3float
+%__modf_result_vec3_f32 = OpTypeStruct %v3float %v3float
  %float_n0_5 = OpConstant %float -0.5
          %16 = OpConstantComposite %v3float %float_n0_5 %float_n0_5 %float_n0_5
    %float_n1 = OpConstant %float -1
          %18 = OpConstantComposite %v3float %float_n1 %float_n1 %float_n1
-         %19 = OpConstantComposite %__modf_result_vec3 %16 %18
-%_ptr_Function___modf_result_vec3 = OpTypePointer Function %__modf_result_vec3
-         %22 = OpConstantNull %__modf_result_vec3
+         %19 = OpConstantComposite %__modf_result_vec3_f32 %16 %18
+%_ptr_Function___modf_result_vec3_f32 = OpTypePointer Function %__modf_result_vec3_f32
+         %22 = OpConstantNull %__modf_result_vec3_f32
          %23 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_5ea256 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result_vec3 Function %22
+        %res = OpVariable %_ptr_Function___modf_result_vec3_f32 Function %22
                OpStore %res %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.dxc.hlsl
index a09bda3..b6d66be 100644
--- a/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 void modf_68d8ee() {
-  modf_result_vec3 res = {(-0.5f).xxx, (-1.0f).xxx};
+  modf_result_vec3_f32 res = {(-0.5f).xxx, (-1.0f).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.fxc.hlsl
index a09bda3..b6d66be 100644
--- a/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 void modf_68d8ee() {
-  modf_result_vec3 res = {(-0.5f).xxx, (-1.0f).xxx};
+  modf_result_vec3_f32 res = {(-0.5f).xxx, (-1.0f).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.glsl
index 24140f3c3..35ec0b6 100644
--- a/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
 
 void modf_68d8ee() {
-  modf_result_vec3 res = modf_result_vec3(vec3(-0.5f), vec3(-1.0f));
+  modf_result_vec3_f32 res = modf_result_vec3_f32(vec3(-0.5f), vec3(-1.0f));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
 
 void modf_68d8ee() {
-  modf_result_vec3 res = modf_result_vec3(vec3(-0.5f), vec3(-1.0f));
+  modf_result_vec3_f32 res = modf_result_vec3_f32(vec3(-0.5f), vec3(-1.0f));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
 
 void modf_68d8ee() {
-  modf_result_vec3 res = modf_result_vec3(vec3(-0.5f), vec3(-1.0f));
+  modf_result_vec3_f32 res = modf_result_vec3_f32(vec3(-0.5f), vec3(-1.0f));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.msl
index d24f9fd..fb71dda 100644
--- a/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 void modf_68d8ee() {
-  modf_result_vec3 res = modf_result_vec3{.fract=float3(-0.5f), .whole=float3(-1.0f)};
+  modf_result_vec3_f32 res = modf_result_vec3_f32{.fract=float3(-0.5f), .whole=float3(-1.0f)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.spvasm
index e08886d..414e02e 100644
--- a/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/modf/68d8ee.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_68d8ee "modf_68d8ee"
-               OpName %__modf_result_vec3 "__modf_result_vec3"
-               OpMemberName %__modf_result_vec3 0 "fract"
-               OpMemberName %__modf_result_vec3 1 "whole"
+               OpName %__modf_result_vec3_f32 "__modf_result_vec3_f32"
+               OpMemberName %__modf_result_vec3_f32 0 "fract"
+               OpMemberName %__modf_result_vec3_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec3 0 Offset 0
-               OpMemberDecorate %__modf_result_vec3 1 Offset 16
+               OpMemberDecorate %__modf_result_vec3_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec3_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -36,19 +36,19 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
     %v3float = OpTypeVector %float 3
-%__modf_result_vec3 = OpTypeStruct %v3float %v3float
+%__modf_result_vec3_f32 = OpTypeStruct %v3float %v3float
  %float_n0_5 = OpConstant %float -0.5
          %16 = OpConstantComposite %v3float %float_n0_5 %float_n0_5 %float_n0_5
    %float_n1 = OpConstant %float -1
          %18 = OpConstantComposite %v3float %float_n1 %float_n1 %float_n1
-         %19 = OpConstantComposite %__modf_result_vec3 %16 %18
-%_ptr_Function___modf_result_vec3 = OpTypePointer Function %__modf_result_vec3
-         %22 = OpConstantNull %__modf_result_vec3
+         %19 = OpConstantComposite %__modf_result_vec3_f32 %16 %18
+%_ptr_Function___modf_result_vec3_f32 = OpTypePointer Function %__modf_result_vec3_f32
+         %22 = OpConstantNull %__modf_result_vec3_f32
          %23 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_68d8ee = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result_vec3 Function %22
+        %res = OpVariable %_ptr_Function___modf_result_vec3_f32 Function %22
                OpStore %res %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.dxc.hlsl
index 348870d..57110ac 100644
--- a/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 void modf_732aa6() {
-  modf_result_vec2 res = {(-0.5f).xx, (-1.0f).xx};
+  modf_result_vec2_f32 res = {(-0.5f).xx, (-1.0f).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.fxc.hlsl
index 348870d..57110ac 100644
--- a/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 void modf_732aa6() {
-  modf_result_vec2 res = {(-0.5f).xx, (-1.0f).xx};
+  modf_result_vec2_f32 res = {(-0.5f).xx, (-1.0f).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.glsl
index 0695a32..bc6f4fb 100644
--- a/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void modf_732aa6() {
-  modf_result_vec2 res = modf_result_vec2(vec2(-0.5f), vec2(-1.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(-0.5f), vec2(-1.0f));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void modf_732aa6() {
-  modf_result_vec2 res = modf_result_vec2(vec2(-0.5f), vec2(-1.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(-0.5f), vec2(-1.0f));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void modf_732aa6() {
-  modf_result_vec2 res = modf_result_vec2(vec2(-0.5f), vec2(-1.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(-0.5f), vec2(-1.0f));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.msl
index dcb1f40..c8a6fc0 100644
--- a/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 void modf_732aa6() {
-  modf_result_vec2 res = modf_result_vec2{.fract=float2(-0.5f), .whole=float2(-1.0f)};
+  modf_result_vec2_f32 res = modf_result_vec2_f32{.fract=float2(-0.5f), .whole=float2(-1.0f)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.spvasm
index 28a7da4..59f9475 100644
--- a/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/modf/732aa6.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_732aa6 "modf_732aa6"
-               OpName %__modf_result_vec2 "__modf_result_vec2"
-               OpMemberName %__modf_result_vec2 0 "fract"
-               OpMemberName %__modf_result_vec2 1 "whole"
+               OpName %__modf_result_vec2_f32 "__modf_result_vec2_f32"
+               OpMemberName %__modf_result_vec2_f32 0 "fract"
+               OpMemberName %__modf_result_vec2_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec2 0 Offset 0
-               OpMemberDecorate %__modf_result_vec2 1 Offset 8
+               OpMemberDecorate %__modf_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec2_f32 1 Offset 8
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -36,19 +36,19 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
     %v2float = OpTypeVector %float 2
-%__modf_result_vec2 = OpTypeStruct %v2float %v2float
+%__modf_result_vec2_f32 = OpTypeStruct %v2float %v2float
  %float_n0_5 = OpConstant %float -0.5
          %16 = OpConstantComposite %v2float %float_n0_5 %float_n0_5
    %float_n1 = OpConstant %float -1
          %18 = OpConstantComposite %v2float %float_n1 %float_n1
-         %19 = OpConstantComposite %__modf_result_vec2 %16 %18
-%_ptr_Function___modf_result_vec2 = OpTypePointer Function %__modf_result_vec2
-         %22 = OpConstantNull %__modf_result_vec2
+         %19 = OpConstantComposite %__modf_result_vec2_f32 %16 %18
+%_ptr_Function___modf_result_vec2_f32 = OpTypePointer Function %__modf_result_vec2_f32
+         %22 = OpConstantNull %__modf_result_vec2_f32
          %23 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_732aa6 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result_vec2 Function %22
+        %res = OpVariable %_ptr_Function___modf_result_vec2_f32 Function %22
                OpStore %res %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.dxc.hlsl
index ec4e06b..2286adb 100644
--- a/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 void modf_bbf7f7() {
-  modf_result res = {-0.5f, -1.0f};
+  modf_result_f32 res = {-0.5f, -1.0f};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.fxc.hlsl
index ec4e06b..2286adb 100644
--- a/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 void modf_bbf7f7() {
-  modf_result res = {-0.5f, -1.0f};
+  modf_result_f32 res = {-0.5f, -1.0f};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.glsl
index 177ebe9..5ccbc18 100644
--- a/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void modf_bbf7f7() {
-  modf_result res = modf_result(-0.5f, -1.0f);
+  modf_result_f32 res = modf_result_f32(-0.5f, -1.0f);
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void modf_bbf7f7() {
-  modf_result res = modf_result(-0.5f, -1.0f);
+  modf_result_f32 res = modf_result_f32(-0.5f, -1.0f);
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void modf_bbf7f7() {
-  modf_result res = modf_result(-0.5f, -1.0f);
+  modf_result_f32 res = modf_result_f32(-0.5f, -1.0f);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.msl
index f5fdb55..72474c3 100644
--- a/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 void modf_bbf7f7() {
-  modf_result res = modf_result{.fract=-0.5f, .whole=-1.0f};
+  modf_result_f32 res = modf_result_f32{.fract=-0.5f, .whole=-1.0f};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.spvasm
index 1f64077..850bbf1 100644
--- a/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/modf/bbf7f7.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_bbf7f7 "modf_bbf7f7"
-               OpName %__modf_result "__modf_result"
-               OpMemberName %__modf_result 0 "fract"
-               OpMemberName %__modf_result 1 "whole"
+               OpName %__modf_result_f32 "__modf_result_f32"
+               OpMemberName %__modf_result_f32 0 "fract"
+               OpMemberName %__modf_result_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result 0 Offset 0
-               OpMemberDecorate %__modf_result 1 Offset 4
+               OpMemberDecorate %__modf_result_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_f32 1 Offset 4
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -35,17 +35,17 @@
 %vertex_point_size = OpVariable %_ptr_Output_float Output %8
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
-%__modf_result = OpTypeStruct %float %float
+%__modf_result_f32 = OpTypeStruct %float %float
  %float_n0_5 = OpConstant %float -0.5
    %float_n1 = OpConstant %float -1
-         %16 = OpConstantComposite %__modf_result %float_n0_5 %float_n1
-%_ptr_Function___modf_result = OpTypePointer Function %__modf_result
-         %19 = OpConstantNull %__modf_result
+         %16 = OpConstantComposite %__modf_result_f32 %float_n0_5 %float_n1
+%_ptr_Function___modf_result_f32 = OpTypePointer Function %__modf_result_f32
+         %19 = OpConstantNull %__modf_result_f32
          %20 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_bbf7f7 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result Function %19
+        %res = OpVariable %_ptr_Function___modf_result_f32 Function %19
                OpStore %res %16
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.dxc.hlsl
index 15c5b11..efc499f 100644
--- a/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 void modf_c15f48() {
-  modf_result res = {-0.5f, -1.0f};
+  modf_result_f32 res = {-0.5f, -1.0f};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.fxc.hlsl
index 15c5b11..efc499f 100644
--- a/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 void modf_c15f48() {
-  modf_result res = {-0.5f, -1.0f};
+  modf_result_f32 res = {-0.5f, -1.0f};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.glsl
index 3c6410f..14adca5 100644
--- a/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void modf_c15f48() {
-  modf_result res = modf_result(-0.5f, -1.0f);
+  modf_result_f32 res = modf_result_f32(-0.5f, -1.0f);
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void modf_c15f48() {
-  modf_result res = modf_result(-0.5f, -1.0f);
+  modf_result_f32 res = modf_result_f32(-0.5f, -1.0f);
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void modf_c15f48() {
-  modf_result res = modf_result(-0.5f, -1.0f);
+  modf_result_f32 res = modf_result_f32(-0.5f, -1.0f);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.msl
index 676ddc1..da3399a 100644
--- a/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 void modf_c15f48() {
-  modf_result res = modf_result{.fract=-0.5f, .whole=-1.0f};
+  modf_result_f32 res = modf_result_f32{.fract=-0.5f, .whole=-1.0f};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.spvasm
index c18f9c6..9676ba1 100644
--- a/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/modf/c15f48.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_c15f48 "modf_c15f48"
-               OpName %__modf_result "__modf_result"
-               OpMemberName %__modf_result 0 "fract"
-               OpMemberName %__modf_result 1 "whole"
+               OpName %__modf_result_f32 "__modf_result_f32"
+               OpMemberName %__modf_result_f32 0 "fract"
+               OpMemberName %__modf_result_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result 0 Offset 0
-               OpMemberDecorate %__modf_result 1 Offset 4
+               OpMemberDecorate %__modf_result_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_f32 1 Offset 4
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -35,17 +35,17 @@
 %vertex_point_size = OpVariable %_ptr_Output_float Output %8
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
-%__modf_result = OpTypeStruct %float %float
+%__modf_result_f32 = OpTypeStruct %float %float
  %float_n0_5 = OpConstant %float -0.5
    %float_n1 = OpConstant %float -1
-         %16 = OpConstantComposite %__modf_result %float_n0_5 %float_n1
-%_ptr_Function___modf_result = OpTypePointer Function %__modf_result
-         %19 = OpConstantNull %__modf_result
+         %16 = OpConstantComposite %__modf_result_f32 %float_n0_5 %float_n1
+%_ptr_Function___modf_result_f32 = OpTypePointer Function %__modf_result_f32
+         %19 = OpConstantNull %__modf_result_f32
          %20 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_c15f48 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result Function %19
+        %res = OpVariable %_ptr_Function___modf_result_f32 Function %19
                OpStore %res %16
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.dxc.hlsl
index e72d03c..f105600 100644
--- a/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
 void modf_f3d1f9() {
-  modf_result_vec4 res = {(-0.5f).xxxx, (-1.0f).xxxx};
+  modf_result_vec4_f32 res = {(-0.5f).xxxx, (-1.0f).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.fxc.hlsl
index e72d03c..f105600 100644
--- a/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
 void modf_f3d1f9() {
-  modf_result_vec4 res = {(-0.5f).xxxx, (-1.0f).xxxx};
+  modf_result_vec4_f32 res = {(-0.5f).xxxx, (-1.0f).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.glsl
index 3f2277d..7dcc135 100644
--- a/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
 
 void modf_f3d1f9() {
-  modf_result_vec4 res = modf_result_vec4(vec4(-0.5f), vec4(-1.0f));
+  modf_result_vec4_f32 res = modf_result_vec4_f32(vec4(-0.5f), vec4(-1.0f));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
 
 void modf_f3d1f9() {
-  modf_result_vec4 res = modf_result_vec4(vec4(-0.5f), vec4(-1.0f));
+  modf_result_vec4_f32 res = modf_result_vec4_f32(vec4(-0.5f), vec4(-1.0f));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
 
 void modf_f3d1f9() {
-  modf_result_vec4 res = modf_result_vec4(vec4(-0.5f), vec4(-1.0f));
+  modf_result_vec4_f32 res = modf_result_vec4_f32(vec4(-0.5f), vec4(-1.0f));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.msl b/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.msl
index 087677a..356ea35 100644
--- a/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
 void modf_f3d1f9() {
-  modf_result_vec4 res = modf_result_vec4{.fract=float4(-0.5f), .whole=float4(-1.0f)};
+  modf_result_vec4_f32 res = modf_result_vec4_f32{.fract=float4(-0.5f), .whole=float4(-1.0f)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.spvasm
index 629b8a5..cdb73cb 100644
--- a/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/literal/modf/f3d1f9.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_f3d1f9 "modf_f3d1f9"
-               OpName %__modf_result_vec4 "__modf_result_vec4"
-               OpMemberName %__modf_result_vec4 0 "fract"
-               OpMemberName %__modf_result_vec4 1 "whole"
+               OpName %__modf_result_vec4_f32 "__modf_result_vec4_f32"
+               OpMemberName %__modf_result_vec4_f32 0 "fract"
+               OpMemberName %__modf_result_vec4_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec4 0 Offset 0
-               OpMemberDecorate %__modf_result_vec4 1 Offset 16
+               OpMemberDecorate %__modf_result_vec4_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec4_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -35,19 +35,19 @@
 %vertex_point_size = OpVariable %_ptr_Output_float Output %8
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
-%__modf_result_vec4 = OpTypeStruct %v4float %v4float
+%__modf_result_vec4_f32 = OpTypeStruct %v4float %v4float
  %float_n0_5 = OpConstant %float -0.5
          %15 = OpConstantComposite %v4float %float_n0_5 %float_n0_5 %float_n0_5 %float_n0_5
    %float_n1 = OpConstant %float -1
          %17 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1
-         %18 = OpConstantComposite %__modf_result_vec4 %15 %17
-%_ptr_Function___modf_result_vec4 = OpTypePointer Function %__modf_result_vec4
-         %21 = OpConstantNull %__modf_result_vec4
+         %18 = OpConstantComposite %__modf_result_vec4_f32 %15 %17
+%_ptr_Function___modf_result_vec4_f32 = OpTypePointer Function %__modf_result_vec4_f32
+         %21 = OpConstantNull %__modf_result_vec4_f32
          %22 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_f3d1f9 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result_vec4 Function %21
+        %res = OpVariable %_ptr_Function___modf_result_vec4_f32 Function %21
                OpStore %res %18
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.dxc.hlsl
index f0571de..62d50ee 100644
--- a/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
 void frexp_34bbfb() {
-  frexp_result_vec4 res = {(0.5f).xxxx, (1).xxxx};
+  frexp_result_vec4_f32 res = {(0.5f).xxxx, (1).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.fxc.hlsl
index f0571de..62d50ee 100644
--- a/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
 void frexp_34bbfb() {
-  frexp_result_vec4 res = {(0.5f).xxxx, (1).xxxx};
+  frexp_result_vec4_f32 res = {(0.5f).xxxx, (1).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.glsl b/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.glsl
index b05fb00..f573f2f 100644
--- a/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
 
 void frexp_34bbfb() {
-  frexp_result_vec4 res = frexp_result_vec4(vec4(0.5f), ivec4(1));
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32(vec4(0.5f), ivec4(1));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
 
 void frexp_34bbfb() {
-  frexp_result_vec4 res = frexp_result_vec4(vec4(0.5f), ivec4(1));
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32(vec4(0.5f), ivec4(1));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
 
 void frexp_34bbfb() {
-  frexp_result_vec4 res = frexp_result_vec4(vec4(0.5f), ivec4(1));
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32(vec4(0.5f), ivec4(1));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.msl b/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.msl
index 1a5b652..d1b897f 100644
--- a/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
 void frexp_34bbfb() {
-  frexp_result_vec4 res = frexp_result_vec4{.fract=float4(0.5f), .exp=int4(1)};
+  frexp_result_vec4_f32 res = frexp_result_vec4_f32{.fract=float4(0.5f), .exp=int4(1)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.spvasm b/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.spvasm
index 146a713..26cb2f2 100644
--- a/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/frexp/34bbfb.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_34bbfb "frexp_34bbfb"
-               OpName %__frexp_result_vec4 "__frexp_result_vec4"
-               OpMemberName %__frexp_result_vec4 0 "fract"
-               OpMemberName %__frexp_result_vec4 1 "exp"
+               OpName %__frexp_result_vec4_f32 "__frexp_result_vec4_f32"
+               OpMemberName %__frexp_result_vec4_f32 0 "fract"
+               OpMemberName %__frexp_result_vec4_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec4 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec4 1 Offset 16
+               OpMemberDecorate %__frexp_result_vec4_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec4_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -37,19 +37,19 @@
           %9 = OpTypeFunction %void
         %int = OpTypeInt 32 1
       %v4int = OpTypeVector %int 4
-%__frexp_result_vec4 = OpTypeStruct %v4float %v4int
+%__frexp_result_vec4_f32 = OpTypeStruct %v4float %v4int
   %float_0_5 = OpConstant %float 0.5
          %17 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
       %int_1 = OpConstant %int 1
          %19 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
-         %20 = OpConstantComposite %__frexp_result_vec4 %17 %19
-%_ptr_Function___frexp_result_vec4 = OpTypePointer Function %__frexp_result_vec4
-         %23 = OpConstantNull %__frexp_result_vec4
+         %20 = OpConstantComposite %__frexp_result_vec4_f32 %17 %19
+%_ptr_Function___frexp_result_vec4_f32 = OpTypePointer Function %__frexp_result_vec4_f32
+         %23 = OpConstantNull %__frexp_result_vec4_f32
          %24 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_34bbfb = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result_vec4 Function %23
+        %res = OpVariable %_ptr_Function___frexp_result_vec4_f32 Function %23
                OpStore %res %20
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.dxc.hlsl
index 3f41dc2..6d5d462 100644
--- a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.dxc.hlsl
@@ -1,17 +1,17 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
+frexp_result_f32 tint_frexp(float param_0) {
   float exp;
   float fract = frexp(param_0, exp);
-  frexp_result result = {fract, int(exp)};
+  frexp_result_f32 result = {fract, int(exp)};
   return result;
 }
 
 void frexp_4b2200() {
   float arg_0 = 1.0f;
-  frexp_result res = tint_frexp(arg_0);
+  frexp_result_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.fxc.hlsl
index 3f41dc2..6d5d462 100644
--- a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.fxc.hlsl
@@ -1,17 +1,17 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
+frexp_result_f32 tint_frexp(float param_0) {
   float exp;
   float fract = frexp(param_0, exp);
-  frexp_result result = {fract, int(exp)};
+  frexp_result_f32 result = {fract, int(exp)};
   return result;
 }
 
 void frexp_4b2200() {
   float arg_0 = 1.0f;
-  frexp_result res = tint_frexp(arg_0);
+  frexp_result_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.glsl b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.glsl
index fcae131..3ae3faf 100644
--- a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
-frexp_result tint_frexp(float param_0) {
-  frexp_result result;
+frexp_result_f32 tint_frexp(float param_0) {
+  frexp_result_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void frexp_4b2200() {
   float arg_0 = 1.0f;
-  frexp_result res = tint_frexp(arg_0);
+  frexp_result_f32 res = tint_frexp(arg_0);
 }
 
 vec4 vertex_main() {
@@ -33,13 +33,13 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
-frexp_result tint_frexp(float param_0) {
-  frexp_result result;
+frexp_result_f32 tint_frexp(float param_0) {
+  frexp_result_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -47,7 +47,7 @@
 
 void frexp_4b2200() {
   float arg_0 = 1.0f;
-  frexp_result res = tint_frexp(arg_0);
+  frexp_result_f32 res = tint_frexp(arg_0);
 }
 
 void fragment_main() {
@@ -60,13 +60,13 @@
 }
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
-frexp_result tint_frexp(float param_0) {
-  frexp_result result;
+frexp_result_f32 tint_frexp(float param_0) {
+  frexp_result_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -74,7 +74,7 @@
 
 void frexp_4b2200() {
   float arg_0 = 1.0f;
-  frexp_result res = tint_frexp(arg_0);
+  frexp_result_f32 res = tint_frexp(arg_0);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.msl b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.msl
index fdc5e61..c6d8fee 100644
--- a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
-frexp_result tint_frexp(float param_0) {
-  frexp_result result;
+frexp_result_f32 tint_frexp(float param_0) {
+  frexp_result_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
 
 void frexp_4b2200() {
   float arg_0 = 1.0f;
-  frexp_result res = tint_frexp(arg_0);
+  frexp_result_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.spvasm b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.spvasm
index 44eaa38..16ccb58 100644
--- a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.spvasm
@@ -15,9 +15,9 @@
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_4b2200 "frexp_4b2200"
                OpName %arg_0 "arg_0"
-               OpName %__frexp_result "__frexp_result"
-               OpMemberName %__frexp_result 0 "fract"
-               OpMemberName %__frexp_result 1 "exp"
+               OpName %__frexp_result_f32 "__frexp_result_f32"
+               OpMemberName %__frexp_result_f32 0 "fract"
+               OpMemberName %__frexp_result_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -25,8 +25,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result 0 Offset 0
-               OpMemberDecorate %__frexp_result 1 Offset 4
+               OpMemberDecorate %__frexp_result_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_f32 1 Offset 4
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -40,17 +40,17 @@
     %float_1 = OpConstant %float 1
 %_ptr_Function_float = OpTypePointer Function %float
         %int = OpTypeInt 32 1
-%__frexp_result = OpTypeStruct %float %int
-%_ptr_Function___frexp_result = OpTypePointer Function %__frexp_result
-         %23 = OpConstantNull %__frexp_result
+%__frexp_result_f32 = OpTypeStruct %float %int
+%_ptr_Function___frexp_result_f32 = OpTypePointer Function %__frexp_result_f32
+         %23 = OpConstantNull %__frexp_result_f32
          %24 = OpTypeFunction %v4float
 %frexp_4b2200 = OpFunction %void None %9
          %12 = OpLabel
       %arg_0 = OpVariable %_ptr_Function_float Function %8
-        %res = OpVariable %_ptr_Function___frexp_result Function %23
+        %res = OpVariable %_ptr_Function___frexp_result_f32 Function %23
                OpStore %arg_0 %float_1
          %20 = OpLoad %float %arg_0
-         %16 = OpExtInst %__frexp_result %19 FrexpStruct %20
+         %16 = OpExtInst %__frexp_result_f32 %19 FrexpStruct %20
                OpStore %res %16
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.dxc.hlsl
index cc4ff35..f867068 100644
--- a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = {(0.5f).xx, (1).xx};
+  frexp_result_vec2_f32 res = {(0.5f).xx, (1).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.fxc.hlsl
index cc4ff35..f867068 100644
--- a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = {(0.5f).xx, (1).xx};
+  frexp_result_vec2_f32 res = {(0.5f).xx, (1).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.glsl b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.glsl
index e5ecc96..0887713 100644
--- a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.5f), ivec2(1));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.5f), ivec2(1));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
 
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.5f), ivec2(1));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.msl b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.msl
index 5356433..52c3d8e 100644
--- a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
 void frexp_6fb3ad() {
-  frexp_result_vec2 res = frexp_result_vec2{.fract=float2(0.5f), .exp=int2(1)};
+  frexp_result_vec2_f32 res = frexp_result_vec2_f32{.fract=float2(0.5f), .exp=int2(1)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.spvasm b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.spvasm
index 1d03915..675198b 100644
--- a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_6fb3ad "frexp_6fb3ad"
-               OpName %__frexp_result_vec2 "__frexp_result_vec2"
-               OpMemberName %__frexp_result_vec2 0 "fract"
-               OpMemberName %__frexp_result_vec2 1 "exp"
+               OpName %__frexp_result_vec2_f32 "__frexp_result_vec2_f32"
+               OpMemberName %__frexp_result_vec2_f32 0 "fract"
+               OpMemberName %__frexp_result_vec2_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec2 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec2 1 Offset 8
+               OpMemberDecorate %__frexp_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec2_f32 1 Offset 8
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -38,19 +38,19 @@
     %v2float = OpTypeVector %float 2
         %int = OpTypeInt 32 1
       %v2int = OpTypeVector %int 2
-%__frexp_result_vec2 = OpTypeStruct %v2float %v2int
+%__frexp_result_vec2_f32 = OpTypeStruct %v2float %v2int
   %float_0_5 = OpConstant %float 0.5
          %18 = OpConstantComposite %v2float %float_0_5 %float_0_5
       %int_1 = OpConstant %int 1
          %20 = OpConstantComposite %v2int %int_1 %int_1
-         %21 = OpConstantComposite %__frexp_result_vec2 %18 %20
-%_ptr_Function___frexp_result_vec2 = OpTypePointer Function %__frexp_result_vec2
-         %24 = OpConstantNull %__frexp_result_vec2
+         %21 = OpConstantComposite %__frexp_result_vec2_f32 %18 %20
+%_ptr_Function___frexp_result_vec2_f32 = OpTypePointer Function %__frexp_result_vec2_f32
+         %24 = OpConstantNull %__frexp_result_vec2_f32
          %25 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_6fb3ad = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result_vec2 Function %24
+        %res = OpVariable %_ptr_Function___frexp_result_vec2_f32 Function %24
                OpStore %res %21
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.dxc.hlsl
index c19ac51..9cb9898 100644
--- a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.dxc.hlsl
@@ -1,17 +1,17 @@
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
-frexp_result_vec4 tint_frexp(float4 param_0) {
+frexp_result_vec4_f32 tint_frexp(float4 param_0) {
   float4 exp;
   float4 fract = frexp(param_0, exp);
-  frexp_result_vec4 result = {fract, int4(exp)};
+  frexp_result_vec4_f32 result = {fract, int4(exp)};
   return result;
 }
 
 void frexp_77af93() {
   float4 arg_0 = (1.0f).xxxx;
-  frexp_result_vec4 res = tint_frexp(arg_0);
+  frexp_result_vec4_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.fxc.hlsl
index c19ac51..9cb9898 100644
--- a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.fxc.hlsl
@@ -1,17 +1,17 @@
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
-frexp_result_vec4 tint_frexp(float4 param_0) {
+frexp_result_vec4_f32 tint_frexp(float4 param_0) {
   float4 exp;
   float4 fract = frexp(param_0, exp);
-  frexp_result_vec4 result = {fract, int4(exp)};
+  frexp_result_vec4_f32 result = {fract, int4(exp)};
   return result;
 }
 
 void frexp_77af93() {
   float4 arg_0 = (1.0f).xxxx;
-  frexp_result_vec4 res = tint_frexp(arg_0);
+  frexp_result_vec4_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.glsl b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.glsl
index e8b385e..71c2548 100644
--- a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
-frexp_result_vec4 tint_frexp(vec4 param_0) {
-  frexp_result_vec4 result;
+frexp_result_vec4_f32 tint_frexp(vec4 param_0) {
+  frexp_result_vec4_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void frexp_77af93() {
   vec4 arg_0 = vec4(1.0f);
-  frexp_result_vec4 res = tint_frexp(arg_0);
+  frexp_result_vec4_f32 res = tint_frexp(arg_0);
 }
 
 vec4 vertex_main() {
@@ -33,13 +33,13 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
-frexp_result_vec4 tint_frexp(vec4 param_0) {
-  frexp_result_vec4 result;
+frexp_result_vec4_f32 tint_frexp(vec4 param_0) {
+  frexp_result_vec4_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -47,7 +47,7 @@
 
 void frexp_77af93() {
   vec4 arg_0 = vec4(1.0f);
-  frexp_result_vec4 res = tint_frexp(arg_0);
+  frexp_result_vec4_f32 res = tint_frexp(arg_0);
 }
 
 void fragment_main() {
@@ -60,13 +60,13 @@
 }
 #version 310 es
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   vec4 fract;
   ivec4 exp;
 };
 
-frexp_result_vec4 tint_frexp(vec4 param_0) {
-  frexp_result_vec4 result;
+frexp_result_vec4_f32 tint_frexp(vec4 param_0) {
+  frexp_result_vec4_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -74,7 +74,7 @@
 
 void frexp_77af93() {
   vec4 arg_0 = vec4(1.0f);
-  frexp_result_vec4 res = tint_frexp(arg_0);
+  frexp_result_vec4_f32 res = tint_frexp(arg_0);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.msl b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.msl
index 5e3a177..e3838be 100644
--- a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct frexp_result_vec4 {
+struct frexp_result_vec4_f32 {
   float4 fract;
   int4 exp;
 };
-frexp_result_vec4 tint_frexp(float4 param_0) {
-  frexp_result_vec4 result;
+frexp_result_vec4_f32 tint_frexp(float4 param_0) {
+  frexp_result_vec4_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
 
 void frexp_77af93() {
   float4 arg_0 = float4(1.0f);
-  frexp_result_vec4 res = tint_frexp(arg_0);
+  frexp_result_vec4_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.spvasm b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.spvasm
index 8958b2d..02d9631 100644
--- a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.spvasm
@@ -15,9 +15,9 @@
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_77af93 "frexp_77af93"
                OpName %arg_0 "arg_0"
-               OpName %__frexp_result_vec4 "__frexp_result_vec4"
-               OpMemberName %__frexp_result_vec4 0 "fract"
-               OpMemberName %__frexp_result_vec4 1 "exp"
+               OpName %__frexp_result_vec4_f32 "__frexp_result_vec4_f32"
+               OpMemberName %__frexp_result_vec4_f32 0 "fract"
+               OpMemberName %__frexp_result_vec4_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -25,8 +25,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec4 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec4 1 Offset 16
+               OpMemberDecorate %__frexp_result_vec4_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec4_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -42,17 +42,17 @@
 %_ptr_Function_v4float = OpTypePointer Function %v4float
         %int = OpTypeInt 32 1
       %v4int = OpTypeVector %int 4
-%__frexp_result_vec4 = OpTypeStruct %v4float %v4int
-%_ptr_Function___frexp_result_vec4 = OpTypePointer Function %__frexp_result_vec4
-         %25 = OpConstantNull %__frexp_result_vec4
+%__frexp_result_vec4_f32 = OpTypeStruct %v4float %v4int
+%_ptr_Function___frexp_result_vec4_f32 = OpTypePointer Function %__frexp_result_vec4_f32
+         %25 = OpConstantNull %__frexp_result_vec4_f32
          %26 = OpTypeFunction %v4float
 %frexp_77af93 = OpFunction %void None %9
          %12 = OpLabel
       %arg_0 = OpVariable %_ptr_Function_v4float Function %5
-        %res = OpVariable %_ptr_Function___frexp_result_vec4 Function %25
+        %res = OpVariable %_ptr_Function___frexp_result_vec4_f32 Function %25
                OpStore %arg_0 %14
          %22 = OpLoad %v4float %arg_0
-         %17 = OpExtInst %__frexp_result_vec4 %21 FrexpStruct %22
+         %17 = OpExtInst %__frexp_result_vec4_f32 %21 FrexpStruct %22
                OpStore %res %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.dxc.hlsl
index b67ad75..ec63822 100644
--- a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.dxc.hlsl
@@ -1,17 +1,17 @@
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
-frexp_result_vec3 tint_frexp(float3 param_0) {
+frexp_result_vec3_f32 tint_frexp(float3 param_0) {
   float3 exp;
   float3 fract = frexp(param_0, exp);
-  frexp_result_vec3 result = {fract, int3(exp)};
+  frexp_result_vec3_f32 result = {fract, int3(exp)};
   return result;
 }
 
 void frexp_979800() {
   float3 arg_0 = (1.0f).xxx;
-  frexp_result_vec3 res = tint_frexp(arg_0);
+  frexp_result_vec3_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.fxc.hlsl
index b67ad75..ec63822 100644
--- a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.fxc.hlsl
@@ -1,17 +1,17 @@
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
-frexp_result_vec3 tint_frexp(float3 param_0) {
+frexp_result_vec3_f32 tint_frexp(float3 param_0) {
   float3 exp;
   float3 fract = frexp(param_0, exp);
-  frexp_result_vec3 result = {fract, int3(exp)};
+  frexp_result_vec3_f32 result = {fract, int3(exp)};
   return result;
 }
 
 void frexp_979800() {
   float3 arg_0 = (1.0f).xxx;
-  frexp_result_vec3 res = tint_frexp(arg_0);
+  frexp_result_vec3_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.glsl b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.glsl
index da468f7..3f99207 100644
--- a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
-frexp_result_vec3 tint_frexp(vec3 param_0) {
-  frexp_result_vec3 result;
+frexp_result_vec3_f32 tint_frexp(vec3 param_0) {
+  frexp_result_vec3_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void frexp_979800() {
   vec3 arg_0 = vec3(1.0f);
-  frexp_result_vec3 res = tint_frexp(arg_0);
+  frexp_result_vec3_f32 res = tint_frexp(arg_0);
 }
 
 vec4 vertex_main() {
@@ -33,13 +33,13 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
-frexp_result_vec3 tint_frexp(vec3 param_0) {
-  frexp_result_vec3 result;
+frexp_result_vec3_f32 tint_frexp(vec3 param_0) {
+  frexp_result_vec3_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -47,7 +47,7 @@
 
 void frexp_979800() {
   vec3 arg_0 = vec3(1.0f);
-  frexp_result_vec3 res = tint_frexp(arg_0);
+  frexp_result_vec3_f32 res = tint_frexp(arg_0);
 }
 
 void fragment_main() {
@@ -60,13 +60,13 @@
 }
 #version 310 es
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
-frexp_result_vec3 tint_frexp(vec3 param_0) {
-  frexp_result_vec3 result;
+frexp_result_vec3_f32 tint_frexp(vec3 param_0) {
+  frexp_result_vec3_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -74,7 +74,7 @@
 
 void frexp_979800() {
   vec3 arg_0 = vec3(1.0f);
-  frexp_result_vec3 res = tint_frexp(arg_0);
+  frexp_result_vec3_f32 res = tint_frexp(arg_0);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.msl b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.msl
index 05e4075..88af319 100644
--- a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
-frexp_result_vec3 tint_frexp(float3 param_0) {
-  frexp_result_vec3 result;
+frexp_result_vec3_f32 tint_frexp(float3 param_0) {
+  frexp_result_vec3_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
 
 void frexp_979800() {
   float3 arg_0 = float3(1.0f);
-  frexp_result_vec3 res = tint_frexp(arg_0);
+  frexp_result_vec3_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.spvasm b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.spvasm
index 45d9828..208e3be 100644
--- a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.spvasm
@@ -15,9 +15,9 @@
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_979800 "frexp_979800"
                OpName %arg_0 "arg_0"
-               OpName %__frexp_result_vec3 "__frexp_result_vec3"
-               OpMemberName %__frexp_result_vec3 0 "fract"
-               OpMemberName %__frexp_result_vec3 1 "exp"
+               OpName %__frexp_result_vec3_f32 "__frexp_result_vec3_f32"
+               OpMemberName %__frexp_result_vec3_f32 0 "fract"
+               OpMemberName %__frexp_result_vec3_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -25,8 +25,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec3 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec3 1 Offset 16
+               OpMemberDecorate %__frexp_result_vec3_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec3_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -44,17 +44,17 @@
          %18 = OpConstantNull %v3float
         %int = OpTypeInt 32 1
       %v3int = OpTypeVector %int 3
-%__frexp_result_vec3 = OpTypeStruct %v3float %v3int
-%_ptr_Function___frexp_result_vec3 = OpTypePointer Function %__frexp_result_vec3
-         %27 = OpConstantNull %__frexp_result_vec3
+%__frexp_result_vec3_f32 = OpTypeStruct %v3float %v3int
+%_ptr_Function___frexp_result_vec3_f32 = OpTypePointer Function %__frexp_result_vec3_f32
+         %27 = OpConstantNull %__frexp_result_vec3_f32
          %28 = OpTypeFunction %v4float
 %frexp_979800 = OpFunction %void None %9
          %12 = OpLabel
       %arg_0 = OpVariable %_ptr_Function_v3float Function %18
-        %res = OpVariable %_ptr_Function___frexp_result_vec3 Function %27
+        %res = OpVariable %_ptr_Function___frexp_result_vec3_f32 Function %27
                OpStore %arg_0 %15
          %24 = OpLoad %v3float %arg_0
-         %19 = OpExtInst %__frexp_result_vec3 %23 FrexpStruct %24
+         %19 = OpExtInst %__frexp_result_vec3_f32 %23 FrexpStruct %24
                OpStore %res %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.dxc.hlsl
index efbe069..567f391 100644
--- a/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 void frexp_bee870() {
-  frexp_result res = {0.5f, 1};
+  frexp_result_f32 res = {0.5f, 1};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.fxc.hlsl
index efbe069..567f391 100644
--- a/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 void frexp_bee870() {
-  frexp_result res = {0.5f, 1};
+  frexp_result_f32 res = {0.5f, 1};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.glsl b/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.glsl
index 0e94ee2..2f47c25 100644
--- a/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void frexp_bee870() {
-  frexp_result res = frexp_result(0.5f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.5f, 1);
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void frexp_bee870() {
-  frexp_result res = frexp_result(0.5f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.5f, 1);
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 
 
 void frexp_bee870() {
-  frexp_result res = frexp_result(0.5f, 1);
+  frexp_result_f32 res = frexp_result_f32(0.5f, 1);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.msl b/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.msl
index 8c2107d..8579dce 100644
--- a/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result {
+struct frexp_result_f32 {
   float fract;
   int exp;
 };
 void frexp_bee870() {
-  frexp_result res = frexp_result{.fract=0.5f, .exp=1};
+  frexp_result_f32 res = frexp_result_f32{.fract=0.5f, .exp=1};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.spvasm b/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.spvasm
index b2675a6..673d3be 100644
--- a/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/frexp/bee870.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_bee870 "frexp_bee870"
-               OpName %__frexp_result "__frexp_result"
-               OpMemberName %__frexp_result 0 "fract"
-               OpMemberName %__frexp_result 1 "exp"
+               OpName %__frexp_result_f32 "__frexp_result_f32"
+               OpMemberName %__frexp_result_f32 0 "fract"
+               OpMemberName %__frexp_result_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result 0 Offset 0
-               OpMemberDecorate %__frexp_result 1 Offset 4
+               OpMemberDecorate %__frexp_result_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_f32 1 Offset 4
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -36,17 +36,17 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
         %int = OpTypeInt 32 1
-%__frexp_result = OpTypeStruct %float %int
+%__frexp_result_f32 = OpTypeStruct %float %int
   %float_0_5 = OpConstant %float 0.5
       %int_1 = OpConstant %int 1
-         %17 = OpConstantComposite %__frexp_result %float_0_5 %int_1
-%_ptr_Function___frexp_result = OpTypePointer Function %__frexp_result
-         %20 = OpConstantNull %__frexp_result
+         %17 = OpConstantComposite %__frexp_result_f32 %float_0_5 %int_1
+%_ptr_Function___frexp_result_f32 = OpTypePointer Function %__frexp_result_f32
+         %20 = OpConstantNull %__frexp_result_f32
          %21 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_bee870 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result Function %20
+        %res = OpVariable %_ptr_Function___frexp_result_f32 Function %20
                OpStore %res %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.dxc.hlsl
index c896f2b..daf958c 100644
--- a/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 void frexp_bf45ae() {
-  frexp_result_vec3 res = {(0.5f).xxx, (1).xxx};
+  frexp_result_vec3_f32 res = {(0.5f).xxx, (1).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.fxc.hlsl
index c896f2b..daf958c 100644
--- a/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 void frexp_bf45ae() {
-  frexp_result_vec3 res = {(0.5f).xxx, (1).xxx};
+  frexp_result_vec3_f32 res = {(0.5f).xxx, (1).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.glsl b/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.glsl
index f7f382e..9ced10b 100644
--- a/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
 
 void frexp_bf45ae() {
-  frexp_result_vec3 res = frexp_result_vec3(vec3(0.5f), ivec3(1));
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32(vec3(0.5f), ivec3(1));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
 
 void frexp_bf45ae() {
-  frexp_result_vec3 res = frexp_result_vec3(vec3(0.5f), ivec3(1));
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32(vec3(0.5f), ivec3(1));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   vec3 fract;
   ivec3 exp;
 };
 
 
 void frexp_bf45ae() {
-  frexp_result_vec3 res = frexp_result_vec3(vec3(0.5f), ivec3(1));
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32(vec3(0.5f), ivec3(1));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.msl b/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.msl
index 6bbab11..5609679 100644
--- a/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct frexp_result_vec3 {
+struct frexp_result_vec3_f32 {
   float3 fract;
   int3 exp;
 };
 void frexp_bf45ae() {
-  frexp_result_vec3 res = frexp_result_vec3{.fract=float3(0.5f), .exp=int3(1)};
+  frexp_result_vec3_f32 res = frexp_result_vec3_f32{.fract=float3(0.5f), .exp=int3(1)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.spvasm b/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.spvasm
index 28459bc..92959a2 100644
--- a/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/frexp/bf45ae.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_bf45ae "frexp_bf45ae"
-               OpName %__frexp_result_vec3 "__frexp_result_vec3"
-               OpMemberName %__frexp_result_vec3 0 "fract"
-               OpMemberName %__frexp_result_vec3 1 "exp"
+               OpName %__frexp_result_vec3_f32 "__frexp_result_vec3_f32"
+               OpMemberName %__frexp_result_vec3_f32 0 "fract"
+               OpMemberName %__frexp_result_vec3_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec3 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec3 1 Offset 16
+               OpMemberDecorate %__frexp_result_vec3_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec3_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -38,19 +38,19 @@
     %v3float = OpTypeVector %float 3
         %int = OpTypeInt 32 1
       %v3int = OpTypeVector %int 3
-%__frexp_result_vec3 = OpTypeStruct %v3float %v3int
+%__frexp_result_vec3_f32 = OpTypeStruct %v3float %v3int
   %float_0_5 = OpConstant %float 0.5
          %18 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5
       %int_1 = OpConstant %int 1
          %20 = OpConstantComposite %v3int %int_1 %int_1 %int_1
-         %21 = OpConstantComposite %__frexp_result_vec3 %18 %20
-%_ptr_Function___frexp_result_vec3 = OpTypePointer Function %__frexp_result_vec3
-         %24 = OpConstantNull %__frexp_result_vec3
+         %21 = OpConstantComposite %__frexp_result_vec3_f32 %18 %20
+%_ptr_Function___frexp_result_vec3_f32 = OpTypePointer Function %__frexp_result_vec3_f32
+         %24 = OpConstantNull %__frexp_result_vec3_f32
          %25 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %frexp_bf45ae = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___frexp_result_vec3 Function %24
+        %res = OpVariable %_ptr_Function___frexp_result_vec3_f32 Function %24
                OpStore %res %21
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.dxc.hlsl
index df38699..7615f1c 100644
--- a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.dxc.hlsl
@@ -1,17 +1,17 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
-frexp_result_vec2 tint_frexp(float2 param_0) {
+frexp_result_vec2_f32 tint_frexp(float2 param_0) {
   float2 exp;
   float2 fract = frexp(param_0, exp);
-  frexp_result_vec2 result = {fract, int2(exp)};
+  frexp_result_vec2_f32 result = {fract, int2(exp)};
   return result;
 }
 
 void frexp_eb2421() {
   float2 arg_0 = (1.0f).xx;
-  frexp_result_vec2 res = tint_frexp(arg_0);
+  frexp_result_vec2_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.fxc.hlsl
index df38699..7615f1c 100644
--- a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.fxc.hlsl
@@ -1,17 +1,17 @@
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
-frexp_result_vec2 tint_frexp(float2 param_0) {
+frexp_result_vec2_f32 tint_frexp(float2 param_0) {
   float2 exp;
   float2 fract = frexp(param_0, exp);
-  frexp_result_vec2 result = {fract, int2(exp)};
+  frexp_result_vec2_f32 result = {fract, int2(exp)};
   return result;
 }
 
 void frexp_eb2421() {
   float2 arg_0 = (1.0f).xx;
-  frexp_result_vec2 res = tint_frexp(arg_0);
+  frexp_result_vec2_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.glsl b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.glsl
index ce25fb0..57eb245 100644
--- a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
-frexp_result_vec2 tint_frexp(vec2 param_0) {
-  frexp_result_vec2 result;
+frexp_result_vec2_f32 tint_frexp(vec2 param_0) {
+  frexp_result_vec2_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void frexp_eb2421() {
   vec2 arg_0 = vec2(1.0f);
-  frexp_result_vec2 res = tint_frexp(arg_0);
+  frexp_result_vec2_f32 res = tint_frexp(arg_0);
 }
 
 vec4 vertex_main() {
@@ -33,13 +33,13 @@
 #version 310 es
 precision mediump float;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
-frexp_result_vec2 tint_frexp(vec2 param_0) {
-  frexp_result_vec2 result;
+frexp_result_vec2_f32 tint_frexp(vec2 param_0) {
+  frexp_result_vec2_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -47,7 +47,7 @@
 
 void frexp_eb2421() {
   vec2 arg_0 = vec2(1.0f);
-  frexp_result_vec2 res = tint_frexp(arg_0);
+  frexp_result_vec2_f32 res = tint_frexp(arg_0);
 }
 
 void fragment_main() {
@@ -60,13 +60,13 @@
 }
 #version 310 es
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   vec2 fract;
   ivec2 exp;
 };
 
-frexp_result_vec2 tint_frexp(vec2 param_0) {
-  frexp_result_vec2 result;
+frexp_result_vec2_f32 tint_frexp(vec2 param_0) {
+  frexp_result_vec2_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
@@ -74,7 +74,7 @@
 
 void frexp_eb2421() {
   vec2 arg_0 = vec2(1.0f);
-  frexp_result_vec2 res = tint_frexp(arg_0);
+  frexp_result_vec2_f32 res = tint_frexp(arg_0);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.msl b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.msl
index 1285721..380eac2 100644
--- a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct frexp_result_vec2 {
+struct frexp_result_vec2_f32 {
   float2 fract;
   int2 exp;
 };
-frexp_result_vec2 tint_frexp(float2 param_0) {
-  frexp_result_vec2 result;
+frexp_result_vec2_f32 tint_frexp(float2 param_0) {
+  frexp_result_vec2_f32 result;
   result.fract = frexp(param_0, result.exp);
   return result;
 }
 
 void frexp_eb2421() {
   float2 arg_0 = float2(1.0f);
-  frexp_result_vec2 res = tint_frexp(arg_0);
+  frexp_result_vec2_f32 res = tint_frexp(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.spvasm b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.spvasm
index 751bae0..8637bc4 100644
--- a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.spvasm
@@ -15,9 +15,9 @@
                OpName %vertex_point_size "vertex_point_size"
                OpName %frexp_eb2421 "frexp_eb2421"
                OpName %arg_0 "arg_0"
-               OpName %__frexp_result_vec2 "__frexp_result_vec2"
-               OpMemberName %__frexp_result_vec2 0 "fract"
-               OpMemberName %__frexp_result_vec2 1 "exp"
+               OpName %__frexp_result_vec2_f32 "__frexp_result_vec2_f32"
+               OpMemberName %__frexp_result_vec2_f32 0 "fract"
+               OpMemberName %__frexp_result_vec2_f32 1 "exp"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -25,8 +25,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__frexp_result_vec2 0 Offset 0
-               OpMemberDecorate %__frexp_result_vec2 1 Offset 8
+               OpMemberDecorate %__frexp_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__frexp_result_vec2_f32 1 Offset 8
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -44,17 +44,17 @@
          %18 = OpConstantNull %v2float
         %int = OpTypeInt 32 1
       %v2int = OpTypeVector %int 2
-%__frexp_result_vec2 = OpTypeStruct %v2float %v2int
-%_ptr_Function___frexp_result_vec2 = OpTypePointer Function %__frexp_result_vec2
-         %27 = OpConstantNull %__frexp_result_vec2
+%__frexp_result_vec2_f32 = OpTypeStruct %v2float %v2int
+%_ptr_Function___frexp_result_vec2_f32 = OpTypePointer Function %__frexp_result_vec2_f32
+         %27 = OpConstantNull %__frexp_result_vec2_f32
          %28 = OpTypeFunction %v4float
 %frexp_eb2421 = OpFunction %void None %9
          %12 = OpLabel
       %arg_0 = OpVariable %_ptr_Function_v2float Function %18
-        %res = OpVariable %_ptr_Function___frexp_result_vec2 Function %27
+        %res = OpVariable %_ptr_Function___frexp_result_vec2_f32 Function %27
                OpStore %arg_0 %15
          %24 = OpLoad %v2float %arg_0
-         %19 = OpExtInst %__frexp_result_vec2 %23 FrexpStruct %24
+         %19 = OpExtInst %__frexp_result_vec2_f32 %23 FrexpStruct %24
                OpStore %res %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.dxc.hlsl
index a3745ba..31e9d9d 100644
--- a/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.dxc.hlsl
@@ -1,16 +1,16 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
-modf_result_vec2 tint_modf(float2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(float2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_2d50da() {
   float2 arg_0 = (-1.5f).xx;
-  modf_result_vec2 res = tint_modf(arg_0);
+  modf_result_vec2_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.fxc.hlsl
index a3745ba..31e9d9d 100644
--- a/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.fxc.hlsl
@@ -1,16 +1,16 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
-modf_result_vec2 tint_modf(float2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(float2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_2d50da() {
   float2 arg_0 = (-1.5f).xx;
-  modf_result_vec2 res = tint_modf(arg_0);
+  modf_result_vec2_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.glsl b/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.glsl
index d7ecc21..3e858a2 100644
--- a/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
-modf_result_vec2 tint_modf(vec2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(vec2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void modf_2d50da() {
   vec2 arg_0 = vec2(-1.5f);
-  modf_result_vec2 res = tint_modf(arg_0);
+  modf_result_vec2_f32 res = tint_modf(arg_0);
 }
 
 vec4 vertex_main() {
@@ -33,13 +33,13 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
-modf_result_vec2 tint_modf(vec2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(vec2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -47,7 +47,7 @@
 
 void modf_2d50da() {
   vec2 arg_0 = vec2(-1.5f);
-  modf_result_vec2 res = tint_modf(arg_0);
+  modf_result_vec2_f32 res = tint_modf(arg_0);
 }
 
 void fragment_main() {
@@ -60,13 +60,13 @@
 }
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
-modf_result_vec2 tint_modf(vec2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(vec2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -74,7 +74,7 @@
 
 void modf_2d50da() {
   vec2 arg_0 = vec2(-1.5f);
-  modf_result_vec2 res = tint_modf(arg_0);
+  modf_result_vec2_f32 res = tint_modf(arg_0);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.msl b/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.msl
index 5963525..7129fa8 100644
--- a/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
-modf_result_vec2 tint_modf(float2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(float2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_2d50da() {
   float2 arg_0 = float2(-1.5f);
-  modf_result_vec2 res = tint_modf(arg_0);
+  modf_result_vec2_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.spvasm b/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.spvasm
index 4fda240..3b31f45 100644
--- a/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/modf/2d50da.wgsl.expected.spvasm
@@ -15,9 +15,9 @@
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_2d50da "modf_2d50da"
                OpName %arg_0 "arg_0"
-               OpName %__modf_result_vec2 "__modf_result_vec2"
-               OpMemberName %__modf_result_vec2 0 "fract"
-               OpMemberName %__modf_result_vec2 1 "whole"
+               OpName %__modf_result_vec2_f32 "__modf_result_vec2_f32"
+               OpMemberName %__modf_result_vec2_f32 0 "fract"
+               OpMemberName %__modf_result_vec2_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -25,8 +25,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec2 0 Offset 0
-               OpMemberDecorate %__modf_result_vec2 1 Offset 8
+               OpMemberDecorate %__modf_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec2_f32 1 Offset 8
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -42,18 +42,18 @@
          %15 = OpConstantComposite %v2float %float_n1_5 %float_n1_5
 %_ptr_Function_v2float = OpTypePointer Function %v2float
          %18 = OpConstantNull %v2float
-%__modf_result_vec2 = OpTypeStruct %v2float %v2float
-%_ptr_Function___modf_result_vec2 = OpTypePointer Function %__modf_result_vec2
-         %25 = OpConstantNull %__modf_result_vec2
+%__modf_result_vec2_f32 = OpTypeStruct %v2float %v2float
+%_ptr_Function___modf_result_vec2_f32 = OpTypePointer Function %__modf_result_vec2_f32
+         %25 = OpConstantNull %__modf_result_vec2_f32
          %26 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_2d50da = OpFunction %void None %9
          %12 = OpLabel
       %arg_0 = OpVariable %_ptr_Function_v2float Function %18
-        %res = OpVariable %_ptr_Function___modf_result_vec2 Function %25
+        %res = OpVariable %_ptr_Function___modf_result_vec2_f32 Function %25
                OpStore %arg_0 %15
          %22 = OpLoad %v2float %arg_0
-         %19 = OpExtInst %__modf_result_vec2 %21 ModfStruct %22
+         %19 = OpExtInst %__modf_result_vec2_f32 %21 ModfStruct %22
                OpStore %res %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.dxc.hlsl
index e084fcc..9393f20 100644
--- a/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.dxc.hlsl
@@ -1,16 +1,16 @@
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
-modf_result_vec4 tint_modf(float4 param_0) {
-  modf_result_vec4 result;
+modf_result_vec4_f32 tint_modf(float4 param_0) {
+  modf_result_vec4_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_4bfced() {
   float4 arg_0 = (-1.5f).xxxx;
-  modf_result_vec4 res = tint_modf(arg_0);
+  modf_result_vec4_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.fxc.hlsl
index e084fcc..9393f20 100644
--- a/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.fxc.hlsl
@@ -1,16 +1,16 @@
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
-modf_result_vec4 tint_modf(float4 param_0) {
-  modf_result_vec4 result;
+modf_result_vec4_f32 tint_modf(float4 param_0) {
+  modf_result_vec4_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_4bfced() {
   float4 arg_0 = (-1.5f).xxxx;
-  modf_result_vec4 res = tint_modf(arg_0);
+  modf_result_vec4_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.glsl b/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.glsl
index 5a153b9..a527a59 100644
--- a/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
-modf_result_vec4 tint_modf(vec4 param_0) {
-  modf_result_vec4 result;
+modf_result_vec4_f32 tint_modf(vec4 param_0) {
+  modf_result_vec4_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void modf_4bfced() {
   vec4 arg_0 = vec4(-1.5f);
-  modf_result_vec4 res = tint_modf(arg_0);
+  modf_result_vec4_f32 res = tint_modf(arg_0);
 }
 
 vec4 vertex_main() {
@@ -33,13 +33,13 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
-modf_result_vec4 tint_modf(vec4 param_0) {
-  modf_result_vec4 result;
+modf_result_vec4_f32 tint_modf(vec4 param_0) {
+  modf_result_vec4_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -47,7 +47,7 @@
 
 void modf_4bfced() {
   vec4 arg_0 = vec4(-1.5f);
-  modf_result_vec4 res = tint_modf(arg_0);
+  modf_result_vec4_f32 res = tint_modf(arg_0);
 }
 
 void fragment_main() {
@@ -60,13 +60,13 @@
 }
 #version 310 es
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
-modf_result_vec4 tint_modf(vec4 param_0) {
-  modf_result_vec4 result;
+modf_result_vec4_f32 tint_modf(vec4 param_0) {
+  modf_result_vec4_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -74,7 +74,7 @@
 
 void modf_4bfced() {
   vec4 arg_0 = vec4(-1.5f);
-  modf_result_vec4 res = tint_modf(arg_0);
+  modf_result_vec4_f32 res = tint_modf(arg_0);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.msl b/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.msl
index fe36491..c3bda46 100644
--- a/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
-modf_result_vec4 tint_modf(float4 param_0) {
-  modf_result_vec4 result;
+modf_result_vec4_f32 tint_modf(float4 param_0) {
+  modf_result_vec4_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_4bfced() {
   float4 arg_0 = float4(-1.5f);
-  modf_result_vec4 res = tint_modf(arg_0);
+  modf_result_vec4_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.spvasm b/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.spvasm
index 8bdaea4..6d45f66 100644
--- a/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/modf/4bfced.wgsl.expected.spvasm
@@ -15,9 +15,9 @@
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_4bfced "modf_4bfced"
                OpName %arg_0 "arg_0"
-               OpName %__modf_result_vec4 "__modf_result_vec4"
-               OpMemberName %__modf_result_vec4 0 "fract"
-               OpMemberName %__modf_result_vec4 1 "whole"
+               OpName %__modf_result_vec4_f32 "__modf_result_vec4_f32"
+               OpMemberName %__modf_result_vec4_f32 0 "fract"
+               OpMemberName %__modf_result_vec4_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -25,8 +25,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec4 0 Offset 0
-               OpMemberDecorate %__modf_result_vec4 1 Offset 16
+               OpMemberDecorate %__modf_result_vec4_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec4_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -40,18 +40,18 @@
  %float_n1_5 = OpConstant %float -1.5
          %14 = OpConstantComposite %v4float %float_n1_5 %float_n1_5 %float_n1_5 %float_n1_5
 %_ptr_Function_v4float = OpTypePointer Function %v4float
-%__modf_result_vec4 = OpTypeStruct %v4float %v4float
-%_ptr_Function___modf_result_vec4 = OpTypePointer Function %__modf_result_vec4
-         %23 = OpConstantNull %__modf_result_vec4
+%__modf_result_vec4_f32 = OpTypeStruct %v4float %v4float
+%_ptr_Function___modf_result_vec4_f32 = OpTypePointer Function %__modf_result_vec4_f32
+         %23 = OpConstantNull %__modf_result_vec4_f32
          %24 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_4bfced = OpFunction %void None %9
          %12 = OpLabel
       %arg_0 = OpVariable %_ptr_Function_v4float Function %5
-        %res = OpVariable %_ptr_Function___modf_result_vec4 Function %23
+        %res = OpVariable %_ptr_Function___modf_result_vec4_f32 Function %23
                OpStore %arg_0 %14
          %20 = OpLoad %v4float %arg_0
-         %17 = OpExtInst %__modf_result_vec4 %19 ModfStruct %20
+         %17 = OpExtInst %__modf_result_vec4_f32 %19 ModfStruct %20
                OpStore %res %17
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.dxc.hlsl
index 96db57b..35b3d40 100644
--- a/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.dxc.hlsl
@@ -1,16 +1,16 @@
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
-modf_result_vec3 tint_modf(float3 param_0) {
-  modf_result_vec3 result;
+modf_result_vec3_f32 tint_modf(float3 param_0) {
+  modf_result_vec3_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_5ea256() {
   float3 arg_0 = (-1.5f).xxx;
-  modf_result_vec3 res = tint_modf(arg_0);
+  modf_result_vec3_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.fxc.hlsl
index 96db57b..35b3d40 100644
--- a/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.fxc.hlsl
@@ -1,16 +1,16 @@
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
-modf_result_vec3 tint_modf(float3 param_0) {
-  modf_result_vec3 result;
+modf_result_vec3_f32 tint_modf(float3 param_0) {
+  modf_result_vec3_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_5ea256() {
   float3 arg_0 = (-1.5f).xxx;
-  modf_result_vec3 res = tint_modf(arg_0);
+  modf_result_vec3_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.glsl b/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.glsl
index 9c050b4..994c2eb 100644
--- a/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
-modf_result_vec3 tint_modf(vec3 param_0) {
-  modf_result_vec3 result;
+modf_result_vec3_f32 tint_modf(vec3 param_0) {
+  modf_result_vec3_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void modf_5ea256() {
   vec3 arg_0 = vec3(-1.5f);
-  modf_result_vec3 res = tint_modf(arg_0);
+  modf_result_vec3_f32 res = tint_modf(arg_0);
 }
 
 vec4 vertex_main() {
@@ -33,13 +33,13 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
-modf_result_vec3 tint_modf(vec3 param_0) {
-  modf_result_vec3 result;
+modf_result_vec3_f32 tint_modf(vec3 param_0) {
+  modf_result_vec3_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -47,7 +47,7 @@
 
 void modf_5ea256() {
   vec3 arg_0 = vec3(-1.5f);
-  modf_result_vec3 res = tint_modf(arg_0);
+  modf_result_vec3_f32 res = tint_modf(arg_0);
 }
 
 void fragment_main() {
@@ -60,13 +60,13 @@
 }
 #version 310 es
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
-modf_result_vec3 tint_modf(vec3 param_0) {
-  modf_result_vec3 result;
+modf_result_vec3_f32 tint_modf(vec3 param_0) {
+  modf_result_vec3_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -74,7 +74,7 @@
 
 void modf_5ea256() {
   vec3 arg_0 = vec3(-1.5f);
-  modf_result_vec3 res = tint_modf(arg_0);
+  modf_result_vec3_f32 res = tint_modf(arg_0);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.msl b/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.msl
index f5a7183..d88e5c8 100644
--- a/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
-modf_result_vec3 tint_modf(float3 param_0) {
-  modf_result_vec3 result;
+modf_result_vec3_f32 tint_modf(float3 param_0) {
+  modf_result_vec3_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_5ea256() {
   float3 arg_0 = float3(-1.5f);
-  modf_result_vec3 res = tint_modf(arg_0);
+  modf_result_vec3_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.spvasm b/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.spvasm
index 42c66e4..06cb795 100644
--- a/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/modf/5ea256.wgsl.expected.spvasm
@@ -15,9 +15,9 @@
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_5ea256 "modf_5ea256"
                OpName %arg_0 "arg_0"
-               OpName %__modf_result_vec3 "__modf_result_vec3"
-               OpMemberName %__modf_result_vec3 0 "fract"
-               OpMemberName %__modf_result_vec3 1 "whole"
+               OpName %__modf_result_vec3_f32 "__modf_result_vec3_f32"
+               OpMemberName %__modf_result_vec3_f32 0 "fract"
+               OpMemberName %__modf_result_vec3_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -25,8 +25,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec3 0 Offset 0
-               OpMemberDecorate %__modf_result_vec3 1 Offset 16
+               OpMemberDecorate %__modf_result_vec3_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec3_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -42,18 +42,18 @@
          %15 = OpConstantComposite %v3float %float_n1_5 %float_n1_5 %float_n1_5
 %_ptr_Function_v3float = OpTypePointer Function %v3float
          %18 = OpConstantNull %v3float
-%__modf_result_vec3 = OpTypeStruct %v3float %v3float
-%_ptr_Function___modf_result_vec3 = OpTypePointer Function %__modf_result_vec3
-         %25 = OpConstantNull %__modf_result_vec3
+%__modf_result_vec3_f32 = OpTypeStruct %v3float %v3float
+%_ptr_Function___modf_result_vec3_f32 = OpTypePointer Function %__modf_result_vec3_f32
+         %25 = OpConstantNull %__modf_result_vec3_f32
          %26 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_5ea256 = OpFunction %void None %9
          %12 = OpLabel
       %arg_0 = OpVariable %_ptr_Function_v3float Function %18
-        %res = OpVariable %_ptr_Function___modf_result_vec3 Function %25
+        %res = OpVariable %_ptr_Function___modf_result_vec3_f32 Function %25
                OpStore %arg_0 %15
          %22 = OpLoad %v3float %arg_0
-         %19 = OpExtInst %__modf_result_vec3 %21 ModfStruct %22
+         %19 = OpExtInst %__modf_result_vec3_f32 %21 ModfStruct %22
                OpStore %res %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.dxc.hlsl
index a09bda3..b6d66be 100644
--- a/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 void modf_68d8ee() {
-  modf_result_vec3 res = {(-0.5f).xxx, (-1.0f).xxx};
+  modf_result_vec3_f32 res = {(-0.5f).xxx, (-1.0f).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.fxc.hlsl
index a09bda3..b6d66be 100644
--- a/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 void modf_68d8ee() {
-  modf_result_vec3 res = {(-0.5f).xxx, (-1.0f).xxx};
+  modf_result_vec3_f32 res = {(-0.5f).xxx, (-1.0f).xxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.glsl b/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.glsl
index 24140f3c3..35ec0b6 100644
--- a/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
 
 void modf_68d8ee() {
-  modf_result_vec3 res = modf_result_vec3(vec3(-0.5f), vec3(-1.0f));
+  modf_result_vec3_f32 res = modf_result_vec3_f32(vec3(-0.5f), vec3(-1.0f));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
 
 void modf_68d8ee() {
-  modf_result_vec3 res = modf_result_vec3(vec3(-0.5f), vec3(-1.0f));
+  modf_result_vec3_f32 res = modf_result_vec3_f32(vec3(-0.5f), vec3(-1.0f));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   vec3 fract;
   vec3 whole;
 };
 
 
 void modf_68d8ee() {
-  modf_result_vec3 res = modf_result_vec3(vec3(-0.5f), vec3(-1.0f));
+  modf_result_vec3_f32 res = modf_result_vec3_f32(vec3(-0.5f), vec3(-1.0f));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.msl b/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.msl
index d24f9fd..fb71dda 100644
--- a/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result_vec3 {
+struct modf_result_vec3_f32 {
   float3 fract;
   float3 whole;
 };
 void modf_68d8ee() {
-  modf_result_vec3 res = modf_result_vec3{.fract=float3(-0.5f), .whole=float3(-1.0f)};
+  modf_result_vec3_f32 res = modf_result_vec3_f32{.fract=float3(-0.5f), .whole=float3(-1.0f)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.spvasm b/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.spvasm
index e08886d..414e02e 100644
--- a/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/modf/68d8ee.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_68d8ee "modf_68d8ee"
-               OpName %__modf_result_vec3 "__modf_result_vec3"
-               OpMemberName %__modf_result_vec3 0 "fract"
-               OpMemberName %__modf_result_vec3 1 "whole"
+               OpName %__modf_result_vec3_f32 "__modf_result_vec3_f32"
+               OpMemberName %__modf_result_vec3_f32 0 "fract"
+               OpMemberName %__modf_result_vec3_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec3 0 Offset 0
-               OpMemberDecorate %__modf_result_vec3 1 Offset 16
+               OpMemberDecorate %__modf_result_vec3_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec3_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -36,19 +36,19 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
     %v3float = OpTypeVector %float 3
-%__modf_result_vec3 = OpTypeStruct %v3float %v3float
+%__modf_result_vec3_f32 = OpTypeStruct %v3float %v3float
  %float_n0_5 = OpConstant %float -0.5
          %16 = OpConstantComposite %v3float %float_n0_5 %float_n0_5 %float_n0_5
    %float_n1 = OpConstant %float -1
          %18 = OpConstantComposite %v3float %float_n1 %float_n1 %float_n1
-         %19 = OpConstantComposite %__modf_result_vec3 %16 %18
-%_ptr_Function___modf_result_vec3 = OpTypePointer Function %__modf_result_vec3
-         %22 = OpConstantNull %__modf_result_vec3
+         %19 = OpConstantComposite %__modf_result_vec3_f32 %16 %18
+%_ptr_Function___modf_result_vec3_f32 = OpTypePointer Function %__modf_result_vec3_f32
+         %22 = OpConstantNull %__modf_result_vec3_f32
          %23 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_68d8ee = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result_vec3 Function %22
+        %res = OpVariable %_ptr_Function___modf_result_vec3_f32 Function %22
                OpStore %res %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.dxc.hlsl
index 348870d..57110ac 100644
--- a/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 void modf_732aa6() {
-  modf_result_vec2 res = {(-0.5f).xx, (-1.0f).xx};
+  modf_result_vec2_f32 res = {(-0.5f).xx, (-1.0f).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.fxc.hlsl
index 348870d..57110ac 100644
--- a/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 void modf_732aa6() {
-  modf_result_vec2 res = {(-0.5f).xx, (-1.0f).xx};
+  modf_result_vec2_f32 res = {(-0.5f).xx, (-1.0f).xx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.glsl b/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.glsl
index 0695a32..bc6f4fb 100644
--- a/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void modf_732aa6() {
-  modf_result_vec2 res = modf_result_vec2(vec2(-0.5f), vec2(-1.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(-0.5f), vec2(-1.0f));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void modf_732aa6() {
-  modf_result_vec2 res = modf_result_vec2(vec2(-0.5f), vec2(-1.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(-0.5f), vec2(-1.0f));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void modf_732aa6() {
-  modf_result_vec2 res = modf_result_vec2(vec2(-0.5f), vec2(-1.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(-0.5f), vec2(-1.0f));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.msl b/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.msl
index dcb1f40..c8a6fc0 100644
--- a/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 void modf_732aa6() {
-  modf_result_vec2 res = modf_result_vec2{.fract=float2(-0.5f), .whole=float2(-1.0f)};
+  modf_result_vec2_f32 res = modf_result_vec2_f32{.fract=float2(-0.5f), .whole=float2(-1.0f)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.spvasm
index 28a7da4..59f9475 100644
--- a/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/modf/732aa6.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_732aa6 "modf_732aa6"
-               OpName %__modf_result_vec2 "__modf_result_vec2"
-               OpMemberName %__modf_result_vec2 0 "fract"
-               OpMemberName %__modf_result_vec2 1 "whole"
+               OpName %__modf_result_vec2_f32 "__modf_result_vec2_f32"
+               OpMemberName %__modf_result_vec2_f32 0 "fract"
+               OpMemberName %__modf_result_vec2_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec2 0 Offset 0
-               OpMemberDecorate %__modf_result_vec2 1 Offset 8
+               OpMemberDecorate %__modf_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec2_f32 1 Offset 8
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -36,19 +36,19 @@
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
     %v2float = OpTypeVector %float 2
-%__modf_result_vec2 = OpTypeStruct %v2float %v2float
+%__modf_result_vec2_f32 = OpTypeStruct %v2float %v2float
  %float_n0_5 = OpConstant %float -0.5
          %16 = OpConstantComposite %v2float %float_n0_5 %float_n0_5
    %float_n1 = OpConstant %float -1
          %18 = OpConstantComposite %v2float %float_n1 %float_n1
-         %19 = OpConstantComposite %__modf_result_vec2 %16 %18
-%_ptr_Function___modf_result_vec2 = OpTypePointer Function %__modf_result_vec2
-         %22 = OpConstantNull %__modf_result_vec2
+         %19 = OpConstantComposite %__modf_result_vec2_f32 %16 %18
+%_ptr_Function___modf_result_vec2_f32 = OpTypePointer Function %__modf_result_vec2_f32
+         %22 = OpConstantNull %__modf_result_vec2_f32
          %23 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_732aa6 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result_vec2 Function %22
+        %res = OpVariable %_ptr_Function___modf_result_vec2_f32 Function %22
                OpStore %res %19
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.dxc.hlsl
index 26d23b2..3c6c19f 100644
--- a/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.dxc.hlsl
@@ -1,16 +1,16 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_bbf7f7() {
   float arg_0 = -1.5f;
-  modf_result res = tint_modf(arg_0);
+  modf_result_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.fxc.hlsl
index 26d23b2..3c6c19f 100644
--- a/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.fxc.hlsl
@@ -1,16 +1,16 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_bbf7f7() {
   float arg_0 = -1.5f;
-  modf_result res = tint_modf(arg_0);
+  modf_result_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.glsl b/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.glsl
index 12f70df..a7a2692 100644
--- a/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void modf_bbf7f7() {
   float arg_0 = -1.5f;
-  modf_result res = tint_modf(arg_0);
+  modf_result_f32 res = tint_modf(arg_0);
 }
 
 vec4 vertex_main() {
@@ -33,13 +33,13 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -47,7 +47,7 @@
 
 void modf_bbf7f7() {
   float arg_0 = -1.5f;
-  modf_result res = tint_modf(arg_0);
+  modf_result_f32 res = tint_modf(arg_0);
 }
 
 void fragment_main() {
@@ -60,13 +60,13 @@
 }
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -74,7 +74,7 @@
 
 void modf_bbf7f7() {
   float arg_0 = -1.5f;
-  modf_result res = tint_modf(arg_0);
+  modf_result_f32 res = tint_modf(arg_0);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.msl b/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.msl
index 3e4accd..1f79489 100644
--- a/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 void modf_bbf7f7() {
   float arg_0 = -1.5f;
-  modf_result res = tint_modf(arg_0);
+  modf_result_f32 res = tint_modf(arg_0);
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.spvasm
index 6ffbfde..1cba346 100644
--- a/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/modf/bbf7f7.wgsl.expected.spvasm
@@ -15,9 +15,9 @@
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_bbf7f7 "modf_bbf7f7"
                OpName %arg_0 "arg_0"
-               OpName %__modf_result "__modf_result"
-               OpMemberName %__modf_result 0 "fract"
-               OpMemberName %__modf_result 1 "whole"
+               OpName %__modf_result_f32 "__modf_result_f32"
+               OpMemberName %__modf_result_f32 0 "fract"
+               OpMemberName %__modf_result_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -25,8 +25,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result 0 Offset 0
-               OpMemberDecorate %__modf_result 1 Offset 4
+               OpMemberDecorate %__modf_result_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_f32 1 Offset 4
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -39,18 +39,18 @@
           %9 = OpTypeFunction %void
  %float_n1_5 = OpConstant %float -1.5
 %_ptr_Function_float = OpTypePointer Function %float
-%__modf_result = OpTypeStruct %float %float
-%_ptr_Function___modf_result = OpTypePointer Function %__modf_result
-         %22 = OpConstantNull %__modf_result
+%__modf_result_f32 = OpTypeStruct %float %float
+%_ptr_Function___modf_result_f32 = OpTypePointer Function %__modf_result_f32
+         %22 = OpConstantNull %__modf_result_f32
          %23 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_bbf7f7 = OpFunction %void None %9
          %12 = OpLabel
       %arg_0 = OpVariable %_ptr_Function_float Function %8
-        %res = OpVariable %_ptr_Function___modf_result Function %22
+        %res = OpVariable %_ptr_Function___modf_result_f32 Function %22
                OpStore %arg_0 %float_n1_5
          %19 = OpLoad %float %arg_0
-         %16 = OpExtInst %__modf_result %18 ModfStruct %19
+         %16 = OpExtInst %__modf_result_f32 %18 ModfStruct %19
                OpStore %res %16
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.dxc.hlsl
index 15c5b11..efc499f 100644
--- a/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 void modf_c15f48() {
-  modf_result res = {-0.5f, -1.0f};
+  modf_result_f32 res = {-0.5f, -1.0f};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.fxc.hlsl
index 15c5b11..efc499f 100644
--- a/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 void modf_c15f48() {
-  modf_result res = {-0.5f, -1.0f};
+  modf_result_f32 res = {-0.5f, -1.0f};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.glsl b/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.glsl
index 3c6410f..14adca5 100644
--- a/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void modf_c15f48() {
-  modf_result res = modf_result(-0.5f, -1.0f);
+  modf_result_f32 res = modf_result_f32(-0.5f, -1.0f);
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void modf_c15f48() {
-  modf_result res = modf_result(-0.5f, -1.0f);
+  modf_result_f32 res = modf_result_f32(-0.5f, -1.0f);
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void modf_c15f48() {
-  modf_result res = modf_result(-0.5f, -1.0f);
+  modf_result_f32 res = modf_result_f32(-0.5f, -1.0f);
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.msl b/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.msl
index 676ddc1..da3399a 100644
--- a/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 void modf_c15f48() {
-  modf_result res = modf_result{.fract=-0.5f, .whole=-1.0f};
+  modf_result_f32 res = modf_result_f32{.fract=-0.5f, .whole=-1.0f};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.spvasm b/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.spvasm
index c18f9c6..9676ba1 100644
--- a/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/modf/c15f48.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_c15f48 "modf_c15f48"
-               OpName %__modf_result "__modf_result"
-               OpMemberName %__modf_result 0 "fract"
-               OpMemberName %__modf_result 1 "whole"
+               OpName %__modf_result_f32 "__modf_result_f32"
+               OpMemberName %__modf_result_f32 0 "fract"
+               OpMemberName %__modf_result_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result 0 Offset 0
-               OpMemberDecorate %__modf_result 1 Offset 4
+               OpMemberDecorate %__modf_result_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_f32 1 Offset 4
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -35,17 +35,17 @@
 %vertex_point_size = OpVariable %_ptr_Output_float Output %8
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
-%__modf_result = OpTypeStruct %float %float
+%__modf_result_f32 = OpTypeStruct %float %float
  %float_n0_5 = OpConstant %float -0.5
    %float_n1 = OpConstant %float -1
-         %16 = OpConstantComposite %__modf_result %float_n0_5 %float_n1
-%_ptr_Function___modf_result = OpTypePointer Function %__modf_result
-         %19 = OpConstantNull %__modf_result
+         %16 = OpConstantComposite %__modf_result_f32 %float_n0_5 %float_n1
+%_ptr_Function___modf_result_f32 = OpTypePointer Function %__modf_result_f32
+         %19 = OpConstantNull %__modf_result_f32
          %20 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_c15f48 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result Function %19
+        %res = OpVariable %_ptr_Function___modf_result_f32 Function %19
                OpStore %res %16
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.dxc.hlsl
index e72d03c..f105600 100644
--- a/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
 void modf_f3d1f9() {
-  modf_result_vec4 res = {(-0.5f).xxxx, (-1.0f).xxxx};
+  modf_result_vec4_f32 res = {(-0.5f).xxxx, (-1.0f).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.fxc.hlsl
index e72d03c..f105600 100644
--- a/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
 void modf_f3d1f9() {
-  modf_result_vec4 res = {(-0.5f).xxxx, (-1.0f).xxxx};
+  modf_result_vec4_f32 res = {(-0.5f).xxxx, (-1.0f).xxxx};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.glsl b/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.glsl
index 3f2277d..7dcc135 100644
--- a/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
 
 void modf_f3d1f9() {
-  modf_result_vec4 res = modf_result_vec4(vec4(-0.5f), vec4(-1.0f));
+  modf_result_vec4_f32 res = modf_result_vec4_f32(vec4(-0.5f), vec4(-1.0f));
 }
 
 vec4 vertex_main() {
@@ -26,14 +26,14 @@
 #version 310 es
 precision mediump float;
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
 
 void modf_f3d1f9() {
-  modf_result_vec4 res = modf_result_vec4(vec4(-0.5f), vec4(-1.0f));
+  modf_result_vec4_f32 res = modf_result_vec4_f32(vec4(-0.5f), vec4(-1.0f));
 }
 
 void fragment_main() {
@@ -46,14 +46,14 @@
 }
 #version 310 es
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   vec4 fract;
   vec4 whole;
 };
 
 
 void modf_f3d1f9() {
-  modf_result_vec4 res = modf_result_vec4(vec4(-0.5f), vec4(-1.0f));
+  modf_result_vec4_f32 res = modf_result_vec4_f32(vec4(-0.5f), vec4(-1.0f));
 }
 
 void compute_main() {
diff --git a/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.msl b/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.msl
index 087677a..356ea35 100644
--- a/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result_vec4 {
+struct modf_result_vec4_f32 {
   float4 fract;
   float4 whole;
 };
 void modf_f3d1f9() {
-  modf_result_vec4 res = modf_result_vec4{.fract=float4(-0.5f), .whole=float4(-1.0f)};
+  modf_result_vec4_f32 res = modf_result_vec4_f32{.fract=float4(-0.5f), .whole=float4(-1.0f)};
 }
 
 struct tint_symbol {
diff --git a/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.spvasm b/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.spvasm
index 629b8a5..cdb73cb 100644
--- a/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.spvasm
+++ b/test/tint/builtins/gen/var/modf/f3d1f9.wgsl.expected.spvasm
@@ -13,9 +13,9 @@
                OpName %value "value"
                OpName %vertex_point_size "vertex_point_size"
                OpName %modf_f3d1f9 "modf_f3d1f9"
-               OpName %__modf_result_vec4 "__modf_result_vec4"
-               OpMemberName %__modf_result_vec4 0 "fract"
-               OpMemberName %__modf_result_vec4 1 "whole"
+               OpName %__modf_result_vec4_f32 "__modf_result_vec4_f32"
+               OpMemberName %__modf_result_vec4_f32 0 "fract"
+               OpMemberName %__modf_result_vec4_f32 1 "whole"
                OpName %res "res"
                OpName %vertex_main_inner "vertex_main_inner"
                OpName %vertex_main "vertex_main"
@@ -23,8 +23,8 @@
                OpName %compute_main "compute_main"
                OpDecorate %value BuiltIn Position
                OpDecorate %vertex_point_size BuiltIn PointSize
-               OpMemberDecorate %__modf_result_vec4 0 Offset 0
-               OpMemberDecorate %__modf_result_vec4 1 Offset 16
+               OpMemberDecorate %__modf_result_vec4_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec4_f32 1 Offset 16
       %float = OpTypeFloat 32
     %v4float = OpTypeVector %float 4
 %_ptr_Output_v4float = OpTypePointer Output %v4float
@@ -35,19 +35,19 @@
 %vertex_point_size = OpVariable %_ptr_Output_float Output %8
        %void = OpTypeVoid
           %9 = OpTypeFunction %void
-%__modf_result_vec4 = OpTypeStruct %v4float %v4float
+%__modf_result_vec4_f32 = OpTypeStruct %v4float %v4float
  %float_n0_5 = OpConstant %float -0.5
          %15 = OpConstantComposite %v4float %float_n0_5 %float_n0_5 %float_n0_5 %float_n0_5
    %float_n1 = OpConstant %float -1
          %17 = OpConstantComposite %v4float %float_n1 %float_n1 %float_n1 %float_n1
-         %18 = OpConstantComposite %__modf_result_vec4 %15 %17
-%_ptr_Function___modf_result_vec4 = OpTypePointer Function %__modf_result_vec4
-         %21 = OpConstantNull %__modf_result_vec4
+         %18 = OpConstantComposite %__modf_result_vec4_f32 %15 %17
+%_ptr_Function___modf_result_vec4_f32 = OpTypePointer Function %__modf_result_vec4_f32
+         %21 = OpConstantNull %__modf_result_vec4_f32
          %22 = OpTypeFunction %v4float
     %float_1 = OpConstant %float 1
 %modf_f3d1f9 = OpFunction %void None %9
          %12 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result_vec4 Function %21
+        %res = OpVariable %_ptr_Function___modf_result_vec4_f32 Function %21
                OpStore %res %18
                OpReturn
                OpFunctionEnd
diff --git a/test/tint/builtins/modf/scalar/const.wgsl.expected.dxc.hlsl b/test/tint/builtins/modf/scalar/const.wgsl.expected.dxc.hlsl
index d9bc0d9..c21b729 100644
--- a/test/tint/builtins/modf/scalar/const.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/modf/scalar/const.wgsl.expected.dxc.hlsl
@@ -1,10 +1,10 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const modf_result res = {0.25f, 1.0f};
+  const modf_result_f32 res = {0.25f, 1.0f};
   const float fract = res.fract;
   const float whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/scalar/const.wgsl.expected.fxc.hlsl b/test/tint/builtins/modf/scalar/const.wgsl.expected.fxc.hlsl
index d9bc0d9..c21b729 100644
--- a/test/tint/builtins/modf/scalar/const.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/modf/scalar/const.wgsl.expected.fxc.hlsl
@@ -1,10 +1,10 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const modf_result res = {0.25f, 1.0f};
+  const modf_result_f32 res = {0.25f, 1.0f};
   const float fract = res.fract;
   const float whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/scalar/const.wgsl.expected.glsl b/test/tint/builtins/modf/scalar/const.wgsl.expected.glsl
index a4b79ea..e3a412c 100644
--- a/test/tint/builtins/modf/scalar/const.wgsl.expected.glsl
+++ b/test/tint/builtins/modf/scalar/const.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void tint_symbol() {
-  modf_result res = modf_result(0.25f, 1.0f);
+  modf_result_f32 res = modf_result_f32(0.25f, 1.0f);
   float tint_symbol_2 = res.fract;
   float whole = res.whole;
 }
diff --git a/test/tint/builtins/modf/scalar/const.wgsl.expected.msl b/test/tint/builtins/modf/scalar/const.wgsl.expected.msl
index c232ffa..1bf7d49 100644
--- a/test/tint/builtins/modf/scalar/const.wgsl.expected.msl
+++ b/test/tint/builtins/modf/scalar/const.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 kernel void tint_symbol() {
-  modf_result const res = modf_result{.fract=0.25f, .whole=1.0f};
+  modf_result_f32 const res = modf_result_f32{.fract=0.25f, .whole=1.0f};
   float const fract = res.fract;
   float const whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/scalar/const.wgsl.expected.spvasm b/test/tint/builtins/modf/scalar/const.wgsl.expected.spvasm
index 955924d..b23fa59 100644
--- a/test/tint/builtins/modf/scalar/const.wgsl.expected.spvasm
+++ b/test/tint/builtins/modf/scalar/const.wgsl.expected.spvasm
@@ -8,18 +8,18 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__modf_result "__modf_result"
-               OpMemberName %__modf_result 0 "fract"
-               OpMemberName %__modf_result 1 "whole"
-               OpMemberDecorate %__modf_result 0 Offset 0
-               OpMemberDecorate %__modf_result 1 Offset 4
+               OpName %__modf_result_f32 "__modf_result_f32"
+               OpMemberName %__modf_result_f32 0 "fract"
+               OpMemberName %__modf_result_f32 1 "whole"
+               OpMemberDecorate %__modf_result_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_f32 1 Offset 4
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
-%__modf_result = OpTypeStruct %float %float
+%__modf_result_f32 = OpTypeStruct %float %float
  %float_0_25 = OpConstant %float 0.25
     %float_1 = OpConstant %float 1
-          %9 = OpConstantComposite %__modf_result %float_0_25 %float_1
+          %9 = OpConstantComposite %__modf_result_f32 %float_0_25 %float_1
        %main = OpFunction %void None %1
           %4 = OpLabel
          %10 = OpCompositeExtract %float %9 0
diff --git a/test/tint/builtins/modf/scalar/const_members.wgsl.expected.dxc.hlsl b/test/tint/builtins/modf/scalar/const_members.wgsl.expected.dxc.hlsl
index 1923e02..60ad2a9 100644
--- a/test/tint/builtins/modf/scalar/const_members.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/modf/scalar/const_members.wgsl.expected.dxc.hlsl
@@ -1,12 +1,12 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const modf_result tint_symbol_1 = {0.25f, 1.0f};
+  const modf_result_f32 tint_symbol_1 = {0.25f, 1.0f};
   const float fract = tint_symbol_1.fract;
-  const modf_result tint_symbol_2 = {0.25f, 1.0f};
+  const modf_result_f32 tint_symbol_2 = {0.25f, 1.0f};
   const float whole = tint_symbol_2.whole;
   return;
 }
diff --git a/test/tint/builtins/modf/scalar/const_members.wgsl.expected.fxc.hlsl b/test/tint/builtins/modf/scalar/const_members.wgsl.expected.fxc.hlsl
index 1923e02..60ad2a9 100644
--- a/test/tint/builtins/modf/scalar/const_members.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/modf/scalar/const_members.wgsl.expected.fxc.hlsl
@@ -1,12 +1,12 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const modf_result tint_symbol_1 = {0.25f, 1.0f};
+  const modf_result_f32 tint_symbol_1 = {0.25f, 1.0f};
   const float fract = tint_symbol_1.fract;
-  const modf_result tint_symbol_2 = {0.25f, 1.0f};
+  const modf_result_f32 tint_symbol_2 = {0.25f, 1.0f};
   const float whole = tint_symbol_2.whole;
   return;
 }
diff --git a/test/tint/builtins/modf/scalar/const_members.wgsl.expected.glsl b/test/tint/builtins/modf/scalar/const_members.wgsl.expected.glsl
index cdbe966..27a3ab3 100644
--- a/test/tint/builtins/modf/scalar/const_members.wgsl.expected.glsl
+++ b/test/tint/builtins/modf/scalar/const_members.wgsl.expected.glsl
@@ -1,15 +1,15 @@
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
 
 void tint_symbol() {
-  modf_result tint_symbol_3 = modf_result(0.25f, 1.0f);
+  modf_result_f32 tint_symbol_3 = modf_result_f32(0.25f, 1.0f);
   float tint_symbol_2 = tint_symbol_3.fract;
-  modf_result tint_symbol_4 = modf_result(0.25f, 1.0f);
+  modf_result_f32 tint_symbol_4 = modf_result_f32(0.25f, 1.0f);
   float whole = tint_symbol_4.whole;
 }
 
diff --git a/test/tint/builtins/modf/scalar/const_members.wgsl.expected.msl b/test/tint/builtins/modf/scalar/const_members.wgsl.expected.msl
index d627320..fc8f220 100644
--- a/test/tint/builtins/modf/scalar/const_members.wgsl.expected.msl
+++ b/test/tint/builtins/modf/scalar/const_members.wgsl.expected.msl
@@ -2,14 +2,14 @@
 
 using namespace metal;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 kernel void tint_symbol() {
-  modf_result const tint_symbol_1 = modf_result{.fract=0.25f, .whole=1.0f};
+  modf_result_f32 const tint_symbol_1 = modf_result_f32{.fract=0.25f, .whole=1.0f};
   float const fract = tint_symbol_1.fract;
-  modf_result const tint_symbol_2 = modf_result{.fract=0.25f, .whole=1.0f};
+  modf_result_f32 const tint_symbol_2 = modf_result_f32{.fract=0.25f, .whole=1.0f};
   float const whole = tint_symbol_2.whole;
   return;
 }
diff --git a/test/tint/builtins/modf/scalar/mixed.wgsl.expected.dxc.hlsl b/test/tint/builtins/modf/scalar/mixed.wgsl.expected.dxc.hlsl
index bc03526..852de4c 100644
--- a/test/tint/builtins/modf/scalar/mixed.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/modf/scalar/mixed.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -11,9 +11,9 @@
 [numthreads(1, 1, 1)]
 void main() {
   const float runtime_in = 1.25f;
-  modf_result res = {0.25f, 1.0f};
+  modf_result_f32 res = {0.25f, 1.0f};
   res = tint_modf(runtime_in);
-  const modf_result c = {0.25f, 1.0f};
+  const modf_result_f32 c = {0.25f, 1.0f};
   res = c;
   const float fract = res.fract;
   const float whole = res.whole;
diff --git a/test/tint/builtins/modf/scalar/mixed.wgsl.expected.fxc.hlsl b/test/tint/builtins/modf/scalar/mixed.wgsl.expected.fxc.hlsl
index bc03526..852de4c 100644
--- a/test/tint/builtins/modf/scalar/mixed.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/modf/scalar/mixed.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -11,9 +11,9 @@
 [numthreads(1, 1, 1)]
 void main() {
   const float runtime_in = 1.25f;
-  modf_result res = {0.25f, 1.0f};
+  modf_result_f32 res = {0.25f, 1.0f};
   res = tint_modf(runtime_in);
-  const modf_result c = {0.25f, 1.0f};
+  const modf_result_f32 c = {0.25f, 1.0f};
   res = c;
   const float fract = res.fract;
   const float whole = res.whole;
diff --git a/test/tint/builtins/modf/scalar/mixed.wgsl.expected.glsl b/test/tint/builtins/modf/scalar/mixed.wgsl.expected.glsl
index 545bc6d..4328335 100644
--- a/test/tint/builtins/modf/scalar/mixed.wgsl.expected.glsl
+++ b/test/tint/builtins/modf/scalar/mixed.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -14,9 +14,9 @@
 
 void tint_symbol() {
   float runtime_in = 1.25f;
-  modf_result res = modf_result(0.25f, 1.0f);
+  modf_result_f32 res = modf_result_f32(0.25f, 1.0f);
   res = tint_modf(runtime_in);
-  res = modf_result(0.25f, 1.0f);
+  res = modf_result_f32(0.25f, 1.0f);
   float tint_symbol_1 = res.fract;
   float whole = res.whole;
 }
diff --git a/test/tint/builtins/modf/scalar/mixed.wgsl.expected.msl b/test/tint/builtins/modf/scalar/mixed.wgsl.expected.msl
index 151b046..b2f1ff8 100644
--- a/test/tint/builtins/modf/scalar/mixed.wgsl.expected.msl
+++ b/test/tint/builtins/modf/scalar/mixed.wgsl.expected.msl
@@ -2,21 +2,21 @@
 
 using namespace metal;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 kernel void tint_symbol() {
   float const runtime_in = 1.25f;
-  modf_result res = modf_result{.fract=0.25f, .whole=1.0f};
+  modf_result_f32 res = modf_result_f32{.fract=0.25f, .whole=1.0f};
   res = tint_modf(runtime_in);
-  res = modf_result{.fract=0.25f, .whole=1.0f};
+  res = modf_result_f32{.fract=0.25f, .whole=1.0f};
   float const fract = res.fract;
   float const whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/scalar/mixed.wgsl.expected.spvasm b/test/tint/builtins/modf/scalar/mixed.wgsl.expected.spvasm
index d425d4b..238acd7 100644
--- a/test/tint/builtins/modf/scalar/mixed.wgsl.expected.spvasm
+++ b/test/tint/builtins/modf/scalar/mixed.wgsl.expected.spvasm
@@ -9,31 +9,31 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__modf_result "__modf_result"
-               OpMemberName %__modf_result 0 "fract"
-               OpMemberName %__modf_result 1 "whole"
+               OpName %__modf_result_f32 "__modf_result_f32"
+               OpMemberName %__modf_result_f32 0 "fract"
+               OpMemberName %__modf_result_f32 1 "whole"
                OpName %res "res"
-               OpMemberDecorate %__modf_result 0 Offset 0
-               OpMemberDecorate %__modf_result 1 Offset 4
+               OpMemberDecorate %__modf_result_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_f32 1 Offset 4
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
  %float_1_25 = OpConstant %float 1.25
-%__modf_result = OpTypeStruct %float %float
+%__modf_result_f32 = OpTypeStruct %float %float
  %float_0_25 = OpConstant %float 0.25
     %float_1 = OpConstant %float 1
-         %10 = OpConstantComposite %__modf_result %float_0_25 %float_1
-%_ptr_Function___modf_result = OpTypePointer Function %__modf_result
-         %13 = OpConstantNull %__modf_result
+         %10 = OpConstantComposite %__modf_result_f32 %float_0_25 %float_1
+%_ptr_Function___modf_result_f32 = OpTypePointer Function %__modf_result_f32
+         %13 = OpConstantNull %__modf_result_f32
        %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
 %_ptr_Function_float = OpTypePointer Function %float
      %uint_1 = OpConstant %uint 1
        %main = OpFunction %void None %1
           %4 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result Function %13
+        %res = OpVariable %_ptr_Function___modf_result_f32 Function %13
                OpStore %res %10
-         %14 = OpExtInst %__modf_result %15 ModfStruct %float_1_25
+         %14 = OpExtInst %__modf_result_f32 %15 ModfStruct %float_1_25
                OpStore %res %14
                OpStore %res %10
          %19 = OpAccessChain %_ptr_Function_float %res %uint_0
diff --git a/test/tint/builtins/modf/scalar/runtime.wgsl.expected.dxc.hlsl b/test/tint/builtins/modf/scalar/runtime.wgsl.expected.dxc.hlsl
index aef0ba0..73a61ef 100644
--- a/test/tint/builtins/modf/scalar/runtime.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/modf/scalar/runtime.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -11,7 +11,7 @@
 [numthreads(1, 1, 1)]
 void main() {
   const float tint_symbol = 1.25f;
-  const modf_result res = tint_modf(tint_symbol);
+  const modf_result_f32 res = tint_modf(tint_symbol);
   const float fract = res.fract;
   const float whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/scalar/runtime.wgsl.expected.fxc.hlsl b/test/tint/builtins/modf/scalar/runtime.wgsl.expected.fxc.hlsl
index aef0ba0..73a61ef 100644
--- a/test/tint/builtins/modf/scalar/runtime.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/modf/scalar/runtime.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -11,7 +11,7 @@
 [numthreads(1, 1, 1)]
 void main() {
   const float tint_symbol = 1.25f;
-  const modf_result res = tint_modf(tint_symbol);
+  const modf_result_f32 res = tint_modf(tint_symbol);
   const float fract = res.fract;
   const float whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/scalar/runtime.wgsl.expected.glsl b/test/tint/builtins/modf/scalar/runtime.wgsl.expected.glsl
index 8ab16c1..03664c7 100644
--- a/test/tint/builtins/modf/scalar/runtime.wgsl.expected.glsl
+++ b/test/tint/builtins/modf/scalar/runtime.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
 
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void tint_symbol() {
   float tint_symbol_1 = 1.25f;
-  modf_result res = tint_modf(tint_symbol_1);
+  modf_result_f32 res = tint_modf(tint_symbol_1);
   float tint_symbol_2 = res.fract;
   float whole = res.whole;
 }
diff --git a/test/tint/builtins/modf/scalar/runtime.wgsl.expected.msl b/test/tint/builtins/modf/scalar/runtime.wgsl.expected.msl
index f817e71..762c0f7 100644
--- a/test/tint/builtins/modf/scalar/runtime.wgsl.expected.msl
+++ b/test/tint/builtins/modf/scalar/runtime.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct modf_result {
+struct modf_result_f32 {
   float fract;
   float whole;
 };
-modf_result tint_modf(float param_0) {
-  modf_result result;
+modf_result_f32 tint_modf(float param_0) {
+  modf_result_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 kernel void tint_symbol() {
   float const in = 1.25f;
-  modf_result const res = tint_modf(in);
+  modf_result_f32 const res = tint_modf(in);
   float const fract = res.fract;
   float const whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/scalar/runtime.wgsl.expected.spvasm b/test/tint/builtins/modf/scalar/runtime.wgsl.expected.spvasm
index 86a1097..020cbbb 100644
--- a/test/tint/builtins/modf/scalar/runtime.wgsl.expected.spvasm
+++ b/test/tint/builtins/modf/scalar/runtime.wgsl.expected.spvasm
@@ -9,19 +9,19 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__modf_result "__modf_result"
-               OpMemberName %__modf_result 0 "fract"
-               OpMemberName %__modf_result 1 "whole"
-               OpMemberDecorate %__modf_result 0 Offset 0
-               OpMemberDecorate %__modf_result 1 Offset 4
+               OpName %__modf_result_f32 "__modf_result_f32"
+               OpMemberName %__modf_result_f32 0 "fract"
+               OpMemberName %__modf_result_f32 1 "whole"
+               OpMemberDecorate %__modf_result_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_f32 1 Offset 4
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
  %float_1_25 = OpConstant %float 1.25
-%__modf_result = OpTypeStruct %float %float
+%__modf_result_f32 = OpTypeStruct %float %float
        %main = OpFunction %void None %1
           %4 = OpLabel
-          %7 = OpExtInst %__modf_result %9 ModfStruct %float_1_25
+          %7 = OpExtInst %__modf_result_f32 %9 ModfStruct %float_1_25
          %10 = OpCompositeExtract %float %7 0
          %11 = OpCompositeExtract %float %7 1
                OpReturn
diff --git a/test/tint/builtins/modf/vector/const.wgsl.expected.dxc.hlsl b/test/tint/builtins/modf/vector/const.wgsl.expected.dxc.hlsl
index 401983b..4802ed2 100644
--- a/test/tint/builtins/modf/vector/const.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/modf/vector/const.wgsl.expected.dxc.hlsl
@@ -1,10 +1,10 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const modf_result_vec2 res = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
+  const modf_result_vec2_f32 res = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
   const float2 fract = res.fract;
   const float2 whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/vector/const.wgsl.expected.fxc.hlsl b/test/tint/builtins/modf/vector/const.wgsl.expected.fxc.hlsl
index 401983b..4802ed2 100644
--- a/test/tint/builtins/modf/vector/const.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/modf/vector/const.wgsl.expected.fxc.hlsl
@@ -1,10 +1,10 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const modf_result_vec2 res = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
+  const modf_result_vec2_f32 res = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
   const float2 fract = res.fract;
   const float2 whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/vector/const.wgsl.expected.glsl b/test/tint/builtins/modf/vector/const.wgsl.expected.glsl
index 319636f..48b7079 100644
--- a/test/tint/builtins/modf/vector/const.wgsl.expected.glsl
+++ b/test/tint/builtins/modf/vector/const.wgsl.expected.glsl
@@ -1,13 +1,13 @@
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void tint_symbol() {
-  modf_result_vec2 res = modf_result_vec2(vec2(0.25f, 0.75f), vec2(1.0f, 3.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(0.25f, 0.75f), vec2(1.0f, 3.0f));
   vec2 tint_symbol_2 = res.fract;
   vec2 whole = res.whole;
 }
diff --git a/test/tint/builtins/modf/vector/const.wgsl.expected.msl b/test/tint/builtins/modf/vector/const.wgsl.expected.msl
index 3d88227..5886134 100644
--- a/test/tint/builtins/modf/vector/const.wgsl.expected.msl
+++ b/test/tint/builtins/modf/vector/const.wgsl.expected.msl
@@ -2,12 +2,12 @@
 
 using namespace metal;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 kernel void tint_symbol() {
-  modf_result_vec2 const res = modf_result_vec2{.fract=float2(0.25f, 0.75f), .whole=float2(1.0f, 3.0f)};
+  modf_result_vec2_f32 const res = modf_result_vec2_f32{.fract=float2(0.25f, 0.75f), .whole=float2(1.0f, 3.0f)};
   float2 const fract = res.fract;
   float2 const whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/vector/const.wgsl.expected.spvasm b/test/tint/builtins/modf/vector/const.wgsl.expected.spvasm
index fdfceb7..70d29cf 100644
--- a/test/tint/builtins/modf/vector/const.wgsl.expected.spvasm
+++ b/test/tint/builtins/modf/vector/const.wgsl.expected.spvasm
@@ -8,23 +8,23 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__modf_result_vec2 "__modf_result_vec2"
-               OpMemberName %__modf_result_vec2 0 "fract"
-               OpMemberName %__modf_result_vec2 1 "whole"
-               OpMemberDecorate %__modf_result_vec2 0 Offset 0
-               OpMemberDecorate %__modf_result_vec2 1 Offset 8
+               OpName %__modf_result_vec2_f32 "__modf_result_vec2_f32"
+               OpMemberName %__modf_result_vec2_f32 0 "fract"
+               OpMemberName %__modf_result_vec2_f32 1 "whole"
+               OpMemberDecorate %__modf_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec2_f32 1 Offset 8
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
     %v2float = OpTypeVector %float 2
-%__modf_result_vec2 = OpTypeStruct %v2float %v2float
+%__modf_result_vec2_f32 = OpTypeStruct %v2float %v2float
  %float_0_25 = OpConstant %float 0.25
  %float_0_75 = OpConstant %float 0.75
          %10 = OpConstantComposite %v2float %float_0_25 %float_0_75
     %float_1 = OpConstant %float 1
     %float_3 = OpConstant %float 3
          %13 = OpConstantComposite %v2float %float_1 %float_3
-         %14 = OpConstantComposite %__modf_result_vec2 %10 %13
+         %14 = OpConstantComposite %__modf_result_vec2_f32 %10 %13
        %main = OpFunction %void None %1
           %4 = OpLabel
          %15 = OpCompositeExtract %v2float %14 0
diff --git a/test/tint/builtins/modf/vector/const_members.wgsl.expected.dxc.hlsl b/test/tint/builtins/modf/vector/const_members.wgsl.expected.dxc.hlsl
index f2b0ce2..b73168e 100644
--- a/test/tint/builtins/modf/vector/const_members.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/modf/vector/const_members.wgsl.expected.dxc.hlsl
@@ -1,12 +1,12 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const modf_result_vec2 tint_symbol_1 = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
+  const modf_result_vec2_f32 tint_symbol_1 = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
   const float2 fract = tint_symbol_1.fract;
-  const modf_result_vec2 tint_symbol_2 = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
+  const modf_result_vec2_f32 tint_symbol_2 = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
   const float2 whole = tint_symbol_2.whole;
   return;
 }
diff --git a/test/tint/builtins/modf/vector/const_members.wgsl.expected.fxc.hlsl b/test/tint/builtins/modf/vector/const_members.wgsl.expected.fxc.hlsl
index f2b0ce2..b73168e 100644
--- a/test/tint/builtins/modf/vector/const_members.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/modf/vector/const_members.wgsl.expected.fxc.hlsl
@@ -1,12 +1,12 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 [numthreads(1, 1, 1)]
 void main() {
-  const modf_result_vec2 tint_symbol_1 = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
+  const modf_result_vec2_f32 tint_symbol_1 = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
   const float2 fract = tint_symbol_1.fract;
-  const modf_result_vec2 tint_symbol_2 = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
+  const modf_result_vec2_f32 tint_symbol_2 = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
   const float2 whole = tint_symbol_2.whole;
   return;
 }
diff --git a/test/tint/builtins/modf/vector/const_members.wgsl.expected.glsl b/test/tint/builtins/modf/vector/const_members.wgsl.expected.glsl
index 9ef2879..6c56009 100644
--- a/test/tint/builtins/modf/vector/const_members.wgsl.expected.glsl
+++ b/test/tint/builtins/modf/vector/const_members.wgsl.expected.glsl
@@ -1,15 +1,15 @@
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
 
 void tint_symbol() {
-  modf_result_vec2 tint_symbol_3 = modf_result_vec2(vec2(0.25f, 0.75f), vec2(1.0f, 3.0f));
+  modf_result_vec2_f32 tint_symbol_3 = modf_result_vec2_f32(vec2(0.25f, 0.75f), vec2(1.0f, 3.0f));
   vec2 tint_symbol_2 = tint_symbol_3.fract;
-  modf_result_vec2 tint_symbol_4 = modf_result_vec2(vec2(0.25f, 0.75f), vec2(1.0f, 3.0f));
+  modf_result_vec2_f32 tint_symbol_4 = modf_result_vec2_f32(vec2(0.25f, 0.75f), vec2(1.0f, 3.0f));
   vec2 whole = tint_symbol_4.whole;
 }
 
diff --git a/test/tint/builtins/modf/vector/const_members.wgsl.expected.msl b/test/tint/builtins/modf/vector/const_members.wgsl.expected.msl
index dda3e21..2228581 100644
--- a/test/tint/builtins/modf/vector/const_members.wgsl.expected.msl
+++ b/test/tint/builtins/modf/vector/const_members.wgsl.expected.msl
@@ -2,14 +2,14 @@
 
 using namespace metal;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
 kernel void tint_symbol() {
-  modf_result_vec2 const tint_symbol_1 = modf_result_vec2{.fract=float2(0.25f, 0.75f), .whole=float2(1.0f, 3.0f)};
+  modf_result_vec2_f32 const tint_symbol_1 = modf_result_vec2_f32{.fract=float2(0.25f, 0.75f), .whole=float2(1.0f, 3.0f)};
   float2 const fract = tint_symbol_1.fract;
-  modf_result_vec2 const tint_symbol_2 = modf_result_vec2{.fract=float2(0.25f, 0.75f), .whole=float2(1.0f, 3.0f)};
+  modf_result_vec2_f32 const tint_symbol_2 = modf_result_vec2_f32{.fract=float2(0.25f, 0.75f), .whole=float2(1.0f, 3.0f)};
   float2 const whole = tint_symbol_2.whole;
   return;
 }
diff --git a/test/tint/builtins/modf/vector/mixed.wgsl.expected.dxc.hlsl b/test/tint/builtins/modf/vector/mixed.wgsl.expected.dxc.hlsl
index 60f8472..f917164 100644
--- a/test/tint/builtins/modf/vector/mixed.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/modf/vector/mixed.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
-modf_result_vec2 tint_modf(float2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(float2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -11,9 +11,9 @@
 [numthreads(1, 1, 1)]
 void main() {
   const float2 runtime_in = float2(1.25f, 3.75f);
-  modf_result_vec2 res = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
+  modf_result_vec2_f32 res = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
   res = tint_modf(runtime_in);
-  const modf_result_vec2 c = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
+  const modf_result_vec2_f32 c = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
   res = c;
   const float2 fract = res.fract;
   const float2 whole = res.whole;
diff --git a/test/tint/builtins/modf/vector/mixed.wgsl.expected.fxc.hlsl b/test/tint/builtins/modf/vector/mixed.wgsl.expected.fxc.hlsl
index 60f8472..f917164 100644
--- a/test/tint/builtins/modf/vector/mixed.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/modf/vector/mixed.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
-modf_result_vec2 tint_modf(float2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(float2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -11,9 +11,9 @@
 [numthreads(1, 1, 1)]
 void main() {
   const float2 runtime_in = float2(1.25f, 3.75f);
-  modf_result_vec2 res = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
+  modf_result_vec2_f32 res = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
   res = tint_modf(runtime_in);
-  const modf_result_vec2 c = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
+  const modf_result_vec2_f32 c = {float2(0.25f, 0.75f), float2(1.0f, 3.0f)};
   res = c;
   const float2 fract = res.fract;
   const float2 whole = res.whole;
diff --git a/test/tint/builtins/modf/vector/mixed.wgsl.expected.glsl b/test/tint/builtins/modf/vector/mixed.wgsl.expected.glsl
index 2a8616e..3360a2e 100644
--- a/test/tint/builtins/modf/vector/mixed.wgsl.expected.glsl
+++ b/test/tint/builtins/modf/vector/mixed.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
-modf_result_vec2 tint_modf(vec2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(vec2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -14,9 +14,9 @@
 
 void tint_symbol() {
   vec2 runtime_in = vec2(1.25f, 3.75f);
-  modf_result_vec2 res = modf_result_vec2(vec2(0.25f, 0.75f), vec2(1.0f, 3.0f));
+  modf_result_vec2_f32 res = modf_result_vec2_f32(vec2(0.25f, 0.75f), vec2(1.0f, 3.0f));
   res = tint_modf(runtime_in);
-  res = modf_result_vec2(vec2(0.25f, 0.75f), vec2(1.0f, 3.0f));
+  res = modf_result_vec2_f32(vec2(0.25f, 0.75f), vec2(1.0f, 3.0f));
   vec2 tint_symbol_1 = res.fract;
   vec2 whole = res.whole;
 }
diff --git a/test/tint/builtins/modf/vector/mixed.wgsl.expected.msl b/test/tint/builtins/modf/vector/mixed.wgsl.expected.msl
index beee24f..7717ec6 100644
--- a/test/tint/builtins/modf/vector/mixed.wgsl.expected.msl
+++ b/test/tint/builtins/modf/vector/mixed.wgsl.expected.msl
@@ -2,21 +2,21 @@
 
 using namespace metal;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
-modf_result_vec2 tint_modf(float2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(float2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 kernel void tint_symbol() {
   float2 const runtime_in = float2(1.25f, 3.75f);
-  modf_result_vec2 res = modf_result_vec2{.fract=float2(0.25f, 0.75f), .whole=float2(1.0f, 3.0f)};
+  modf_result_vec2_f32 res = modf_result_vec2_f32{.fract=float2(0.25f, 0.75f), .whole=float2(1.0f, 3.0f)};
   res = tint_modf(runtime_in);
-  res = modf_result_vec2{.fract=float2(0.25f, 0.75f), .whole=float2(1.0f, 3.0f)};
+  res = modf_result_vec2_f32{.fract=float2(0.25f, 0.75f), .whole=float2(1.0f, 3.0f)};
   float2 const fract = res.fract;
   float2 const whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/vector/mixed.wgsl.expected.spvasm b/test/tint/builtins/modf/vector/mixed.wgsl.expected.spvasm
index afd801b..5590902 100644
--- a/test/tint/builtins/modf/vector/mixed.wgsl.expected.spvasm
+++ b/test/tint/builtins/modf/vector/mixed.wgsl.expected.spvasm
@@ -9,12 +9,12 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__modf_result_vec2 "__modf_result_vec2"
-               OpMemberName %__modf_result_vec2 0 "fract"
-               OpMemberName %__modf_result_vec2 1 "whole"
+               OpName %__modf_result_vec2_f32 "__modf_result_vec2_f32"
+               OpMemberName %__modf_result_vec2_f32 0 "fract"
+               OpMemberName %__modf_result_vec2_f32 1 "whole"
                OpName %res "res"
-               OpMemberDecorate %__modf_result_vec2 0 Offset 0
-               OpMemberDecorate %__modf_result_vec2 1 Offset 8
+               OpMemberDecorate %__modf_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec2_f32 1 Offset 8
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
@@ -22,25 +22,25 @@
  %float_1_25 = OpConstant %float 1.25
  %float_3_75 = OpConstant %float 3.75
           %9 = OpConstantComposite %v2float %float_1_25 %float_3_75
-%__modf_result_vec2 = OpTypeStruct %v2float %v2float
+%__modf_result_vec2_f32 = OpTypeStruct %v2float %v2float
  %float_0_25 = OpConstant %float 0.25
  %float_0_75 = OpConstant %float 0.75
          %13 = OpConstantComposite %v2float %float_0_25 %float_0_75
     %float_1 = OpConstant %float 1
     %float_3 = OpConstant %float 3
          %16 = OpConstantComposite %v2float %float_1 %float_3
-         %17 = OpConstantComposite %__modf_result_vec2 %13 %16
-%_ptr_Function___modf_result_vec2 = OpTypePointer Function %__modf_result_vec2
-         %20 = OpConstantNull %__modf_result_vec2
+         %17 = OpConstantComposite %__modf_result_vec2_f32 %13 %16
+%_ptr_Function___modf_result_vec2_f32 = OpTypePointer Function %__modf_result_vec2_f32
+         %20 = OpConstantNull %__modf_result_vec2_f32
        %uint = OpTypeInt 32 0
      %uint_0 = OpConstant %uint 0
 %_ptr_Function_v2float = OpTypePointer Function %v2float
      %uint_1 = OpConstant %uint 1
        %main = OpFunction %void None %1
           %4 = OpLabel
-        %res = OpVariable %_ptr_Function___modf_result_vec2 Function %20
+        %res = OpVariable %_ptr_Function___modf_result_vec2_f32 Function %20
                OpStore %res %17
-         %21 = OpExtInst %__modf_result_vec2 %22 ModfStruct %9
+         %21 = OpExtInst %__modf_result_vec2_f32 %22 ModfStruct %9
                OpStore %res %21
                OpStore %res %17
          %26 = OpAccessChain %_ptr_Function_v2float %res %uint_0
diff --git a/test/tint/builtins/modf/vector/runtime.wgsl.expected.dxc.hlsl b/test/tint/builtins/modf/vector/runtime.wgsl.expected.dxc.hlsl
index 926fd91..5c43ab3 100644
--- a/test/tint/builtins/modf/vector/runtime.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/modf/vector/runtime.wgsl.expected.dxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
-modf_result_vec2 tint_modf(float2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(float2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -11,7 +11,7 @@
 [numthreads(1, 1, 1)]
 void main() {
   const float2 tint_symbol = float2(1.25f, 3.75f);
-  const modf_result_vec2 res = tint_modf(tint_symbol);
+  const modf_result_vec2_f32 res = tint_modf(tint_symbol);
   const float2 fract = res.fract;
   const float2 whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/vector/runtime.wgsl.expected.fxc.hlsl b/test/tint/builtins/modf/vector/runtime.wgsl.expected.fxc.hlsl
index 926fd91..5c43ab3 100644
--- a/test/tint/builtins/modf/vector/runtime.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/modf/vector/runtime.wgsl.expected.fxc.hlsl
@@ -1,9 +1,9 @@
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
-modf_result_vec2 tint_modf(float2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(float2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -11,7 +11,7 @@
 [numthreads(1, 1, 1)]
 void main() {
   const float2 tint_symbol = float2(1.25f, 3.75f);
-  const modf_result_vec2 res = tint_modf(tint_symbol);
+  const modf_result_vec2_f32 res = tint_modf(tint_symbol);
   const float2 fract = res.fract;
   const float2 whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/vector/runtime.wgsl.expected.glsl b/test/tint/builtins/modf/vector/runtime.wgsl.expected.glsl
index fd2df75..0090769 100644
--- a/test/tint/builtins/modf/vector/runtime.wgsl.expected.glsl
+++ b/test/tint/builtins/modf/vector/runtime.wgsl.expected.glsl
@@ -1,12 +1,12 @@
 #version 310 es
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   vec2 fract;
   vec2 whole;
 };
 
-modf_result_vec2 tint_modf(vec2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(vec2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
@@ -14,7 +14,7 @@
 
 void tint_symbol() {
   vec2 tint_symbol_1 = vec2(1.25f, 3.75f);
-  modf_result_vec2 res = tint_modf(tint_symbol_1);
+  modf_result_vec2_f32 res = tint_modf(tint_symbol_1);
   vec2 tint_symbol_2 = res.fract;
   vec2 whole = res.whole;
 }
diff --git a/test/tint/builtins/modf/vector/runtime.wgsl.expected.msl b/test/tint/builtins/modf/vector/runtime.wgsl.expected.msl
index 2b72d61..2b3f971 100644
--- a/test/tint/builtins/modf/vector/runtime.wgsl.expected.msl
+++ b/test/tint/builtins/modf/vector/runtime.wgsl.expected.msl
@@ -2,19 +2,19 @@
 
 using namespace metal;
 
-struct modf_result_vec2 {
+struct modf_result_vec2_f32 {
   float2 fract;
   float2 whole;
 };
-modf_result_vec2 tint_modf(float2 param_0) {
-  modf_result_vec2 result;
+modf_result_vec2_f32 tint_modf(float2 param_0) {
+  modf_result_vec2_f32 result;
   result.fract = modf(param_0, result.whole);
   return result;
 }
 
 kernel void tint_symbol() {
   float2 const in = float2(1.25f, 3.75f);
-  modf_result_vec2 const res = tint_modf(in);
+  modf_result_vec2_f32 const res = tint_modf(in);
   float2 const fract = res.fract;
   float2 const whole = res.whole;
   return;
diff --git a/test/tint/builtins/modf/vector/runtime.wgsl.expected.spvasm b/test/tint/builtins/modf/vector/runtime.wgsl.expected.spvasm
index 675af31..af651ae 100644
--- a/test/tint/builtins/modf/vector/runtime.wgsl.expected.spvasm
+++ b/test/tint/builtins/modf/vector/runtime.wgsl.expected.spvasm
@@ -9,11 +9,11 @@
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %__modf_result_vec2 "__modf_result_vec2"
-               OpMemberName %__modf_result_vec2 0 "fract"
-               OpMemberName %__modf_result_vec2 1 "whole"
-               OpMemberDecorate %__modf_result_vec2 0 Offset 0
-               OpMemberDecorate %__modf_result_vec2 1 Offset 8
+               OpName %__modf_result_vec2_f32 "__modf_result_vec2_f32"
+               OpMemberName %__modf_result_vec2_f32 0 "fract"
+               OpMemberName %__modf_result_vec2_f32 1 "whole"
+               OpMemberDecorate %__modf_result_vec2_f32 0 Offset 0
+               OpMemberDecorate %__modf_result_vec2_f32 1 Offset 8
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
@@ -21,10 +21,10 @@
  %float_1_25 = OpConstant %float 1.25
  %float_3_75 = OpConstant %float 3.75
           %9 = OpConstantComposite %v2float %float_1_25 %float_3_75
-%__modf_result_vec2 = OpTypeStruct %v2float %v2float
+%__modf_result_vec2_f32 = OpTypeStruct %v2float %v2float
        %main = OpFunction %void None %1
           %4 = OpLabel
-         %10 = OpExtInst %__modf_result_vec2 %12 ModfStruct %9
+         %10 = OpExtInst %__modf_result_vec2_f32 %12 ModfStruct %9
          %13 = OpCompositeExtract %v2float %10 0
          %14 = OpCompositeExtract %v2float %10 1
                OpReturn