Fix symbol collision in RenameReservedKeywords()
Fixed: tint:711
Bug: tint:712
Change-Id: I8d0b5c926772c4265d273f6420f101f48ac29b9c
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/47628
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/transform/transform.cc b/src/transform/transform.cc
index 955f16e..20cfb83 100644
--- a/src/transform/transform.cc
+++ b/src/transform/transform.cc
@@ -67,6 +67,9 @@
const char* names[],
size_t count) {
ctx->ReplaceAll([=](Symbol in) {
+ if (!ctx->src->Symbols().HasName(in)) {
+ return ctx->dst->Symbols().New();
+ }
auto name_in = ctx->src->Symbols().NameFor(in);
if (!std::binary_search(names, names + count, name_in)) {
return ctx->dst->Symbols().Register(name_in);
diff --git a/src/writer/hlsl/generator_impl_function_test.cc b/src/writer/hlsl/generator_impl_function_test.cc
index 525ce1f..a12663f 100644
--- a/src/writer/hlsl/generator_impl_function_test.cc
+++ b/src/writer/hlsl/generator_impl_function_test.cc
@@ -119,15 +119,15 @@
GeneratorImpl& gen = SanitizeAndBuild();
ASSERT_TRUE(gen.Generate(out)) << gen.error();
- EXPECT_EQ(result(), R"(struct tint_symbol_1 {
+ EXPECT_EQ(result(), R"(struct tint_symbol_5 {
float foo : TEXCOORD0;
};
struct tint_symbol_2 {
float value : SV_Target1;
};
-tint_symbol_2 frag_main(tint_symbol_1 tint_symbol_6) {
- const float foo = tint_symbol_6.foo;
+tint_symbol_2 frag_main(tint_symbol_5 tint_symbol_7) {
+ const float foo = tint_symbol_7.foo;
const tint_symbol_2 tint_symbol_1 = {foo};
return tint_symbol_1;
}
@@ -153,15 +153,15 @@
GeneratorImpl& gen = SanitizeAndBuild();
ASSERT_TRUE(gen.Generate(out)) << gen.error();
- EXPECT_EQ(result(), R"(struct tint_symbol_1 {
+ EXPECT_EQ(result(), R"(struct tint_symbol_6 {
float4 coord : SV_Position;
};
struct tint_symbol_2 {
float value : SV_Depth;
};
-tint_symbol_2 frag_main(tint_symbol_1 tint_symbol_6) {
- const float4 coord = tint_symbol_6.coord;
+tint_symbol_2 frag_main(tint_symbol_6 tint_symbol_8) {
+ const float4 coord = tint_symbol_8.coord;
const tint_symbol_2 tint_symbol_1 = {coord.x};
return tint_symbol_1;
}
@@ -214,7 +214,7 @@
float col1 : TEXCOORD1;
float col2 : TEXCOORD2;
};
-struct tint_symbol_7 {
+struct tint_symbol_8 {
float col1 : TEXCOORD1;
float col2 : TEXCOORD2;
};
@@ -225,8 +225,8 @@
return tint_symbol_1;
}
-void frag_main(tint_symbol_7 tint_symbol_9) {
- const Interface colors = {tint_symbol_9.col1, tint_symbol_9.col2};
+void frag_main(tint_symbol_8 tint_symbol_10) {
+ const Interface colors = {tint_symbol_10.col1, tint_symbol_10.col2};
const float r = colors.col1;
const float g = colors.col2;
return;
diff --git a/src/writer/hlsl/generator_impl_sanitizer_test.cc b/src/writer/hlsl/generator_impl_sanitizer_test.cc
index 48fbb06..229931d 100644
--- a/src/writer/hlsl/generator_impl_sanitizer_test.cc
+++ b/src/writer/hlsl/generator_impl_sanitizer_test.cc
@@ -62,10 +62,10 @@
ByteAddressBuffer sb : register(t0, space1);
void main() {
- uint tint_symbol_7 = 0u;
- sb.GetDimensions(tint_symbol_7);
- const uint tint_symbol_9 = ((tint_symbol_7 - 16u) / 16u);
- uint len = tint_symbol_9;
+ uint tint_symbol_9 = 0u;
+ sb.GetDimensions(tint_symbol_9);
+ const uint tint_symbol_10 = ((tint_symbol_9 - 16u) / 16u);
+ uint len = tint_symbol_10;
return;
}
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index a766061..6b1f2d8 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -108,15 +108,15 @@
EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>
using namespace metal;
-struct tint_symbol_3 {
+struct tint_symbol_1 {
float foo [[user(locn0)]];
};
-struct tint_symbol_5 {
+struct tint_symbol_3 {
float value [[color(1)]];
};
-fragment tint_symbol_5 frag_main(tint_symbol_3 tint_symbol_1 [[stage_in]]) {
- const float foo = tint_symbol_1.foo;
+fragment tint_symbol_3 frag_main(tint_symbol_1 tint_symbol_6 [[stage_in]]) {
+ const float foo = tint_symbol_6.foo;
return {foo};
}
@@ -141,15 +141,15 @@
EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>
using namespace metal;
-struct tint_symbol_3 {
+struct tint_symbol_1 {
float4 coord [[position]];
};
-struct tint_symbol_5 {
+struct tint_symbol_3 {
float value [[depth(any)]];
};
-fragment tint_symbol_5 frag_main(tint_symbol_3 tint_symbol_1 [[stage_in]]) {
- const float4 coord = tint_symbol_1.coord;
+fragment tint_symbol_3 frag_main(tint_symbol_1 tint_symbol_6 [[stage_in]]) {
+ const float4 coord = tint_symbol_6.coord;
return {coord.x};
}
@@ -202,18 +202,18 @@
float col1 [[user(locn1)]];
float col2 [[user(locn2)]];
};
-struct tint_symbol_9 {
+struct tint_symbol_7 {
float col1 [[user(locn1)]];
float col2 [[user(locn2)]];
};
vertex tint_symbol_4 vert_main() {
- const Interface tint_symbol_5 = {0.5f, 0.25f};
- return {tint_symbol_5.col1, tint_symbol_5.col2};
+ const Interface tint_symbol_6 = {0.5f, 0.25f};
+ return {tint_symbol_6.col1, tint_symbol_6.col2};
}
-fragment void frag_main(tint_symbol_9 tint_symbol_7 [[stage_in]]) {
- const Interface colors = {tint_symbol_7.col1, tint_symbol_7.col2};
+fragment void frag_main(tint_symbol_7 tint_symbol_9 [[stage_in]]) {
+ const Interface colors = {tint_symbol_9.col1, tint_symbol_9.col2};
const float r = colors.col1;
const float g = colors.col2;
return;
@@ -266,10 +266,10 @@
struct VertexOutput {
float4 pos;
};
-struct tint_symbol_3 {
+struct tint_symbol_5 {
float4 pos [[position]];
};
-struct tint_symbol_7 {
+struct tint_symbol_8 {
float4 pos [[position]];
};
@@ -277,14 +277,14 @@
return {float4(x, x, x, 1.0f)};
}
-vertex tint_symbol_3 vert_main1() {
- const VertexOutput tint_symbol_5 = {foo(0.5f)};
- return {tint_symbol_5.pos};
+vertex tint_symbol_5 vert_main1() {
+ const VertexOutput tint_symbol_7 = {foo(0.5f)};
+ return {tint_symbol_7.pos};
}
-vertex tint_symbol_7 vert_main2() {
- const VertexOutput tint_symbol_8 = {foo(0.25f)};
- return {tint_symbol_8.pos};
+vertex tint_symbol_8 vert_main2() {
+ const VertexOutput tint_symbol_10 = {foo(0.25f)};
+ return {tint_symbol_10.pos};
}
)");