// Copyright 2021 The Tint Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "src/tint/transform/unshadow.h" #include "src/tint/transform/test_helper.h" namespace tint { namespace transform { namespace { using UnshadowTest = TransformTest; TEST_F(UnshadowTest, EmptyModule) { auto* src = ""; auto* expect = ""; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, Noop) { auto* src = R"( var a : i32; let b : i32 = 1; fn F(c : i32) { var d : i32; let e : i32 = 1; { var f : i32; let g : i32 = 1; } } )"; auto* expect = src; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsAlias) { auto* src = R"( type a = i32; fn X() { var a = false; } fn Y() { let a = true; } )"; auto* expect = R"( type a = i32; fn X() { var a_1 = false; } fn Y() { let a_2 = true; } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsAlias_OutOfOrder) { auto* src = R"( fn X() { var a = false; } fn Y() { let a = true; } type a = i32; )"; auto* expect = R"( fn X() { var a_1 = false; } fn Y() { let a_2 = true; } type a = i32; )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsStruct) { auto* src = R"( struct a { m : i32; }; fn X() { var a = true; } fn Y() { let a = false; } )"; auto* expect = R"( struct a { m : i32; } fn X() { var a_1 = true; } fn Y() { let a_2 = false; } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsStruct_OutOfOrder) { auto* src = R"( fn X() { var a = true; } fn Y() { let a = false; } struct a { m : i32; }; )"; auto* expect = R"( fn X() { var a_1 = true; } fn Y() { let a_2 = false; } struct a { m : i32; } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsFunction) { auto* src = R"( fn a() { var a = true; var b = false; } fn b() { let a = true; let b = false; } )"; auto* expect = R"( fn a() { var a_1 = true; var b_1 = false; } fn b() { let a_2 = true; let b_2 = false; } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsFunction_OutOfOrder) { auto* src = R"( fn b() { let a = true; let b = false; } fn a() { var a = true; var b = false; } )"; auto* expect = R"( fn b() { let a_1 = true; let b_1 = false; } fn a() { var a_2 = true; var b_2 = false; } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsGlobalVar) { auto* src = R"( var a : i32; fn X() { var a = (a == 123); } fn Y() { let a = (a == 321); } )"; auto* expect = R"( var a : i32; fn X() { var a_1 = (a == 123); } fn Y() { let a_2 = (a == 321); } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsGlobalVar_OutOfOrder) { auto* src = R"( fn X() { var a = (a == 123); } fn Y() { let a = (a == 321); } var a : i32; )"; auto* expect = R"( fn X() { var a_1 = (a == 123); } fn Y() { let a_2 = (a == 321); } var a : i32; )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsGlobalLet) { auto* src = R"( let a : i32 = 1; fn X() { var a = (a == 123); } fn Y() { let a = (a == 321); } )"; auto* expect = R"( let a : i32 = 1; fn X() { var a_1 = (a == 123); } fn Y() { let a_2 = (a == 321); } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsGlobalLet_OutOfOrder) { auto* src = R"( fn X() { var a = (a == 123); } fn Y() { let a = (a == 321); } let a : i32 = 1; )"; auto* expect = R"( fn X() { var a_1 = (a == 123); } fn Y() { let a_2 = (a == 321); } let a : i32 = 1; )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsLocalVar) { auto* src = R"( fn X() { var a : i32; { var a = (a == 123); } { let a = (a == 321); } } )"; auto* expect = R"( fn X() { var a : i32; { var a_1 = (a == 123); } { let a_2 = (a == 321); } } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsLocalLet) { auto* src = R"( fn X() { let a = 1; { var a = (a == 123); } { let a = (a == 321); } } )"; auto* expect = R"( fn X() { let a = 1; { var a_1 = (a == 123); } { let a_2 = (a == 321); } } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, LocalShadowsParam) { auto* src = R"( fn F(a : i32) { { var a = (a == 123); } { let a = (a == 321); } } )"; auto* expect = R"( fn F(a : i32) { { var a_1 = (a == 123); } { let a_2 = (a == 321); } } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, ParamShadowsFunction) { auto* src = R"( fn a(a : i32) { { var a = (a == 123); } { let a = (a == 321); } } )"; auto* expect = R"( fn a(a_1 : i32) { { var a_2 = (a_1 == 123); } { let a_3 = (a_1 == 321); } } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, ParamShadowsGlobalVar) { auto* src = R"( var a : i32; fn F(a : bool) { } )"; auto* expect = R"( var a : i32; fn F(a_1 : bool) { } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, ParamShadowsGlobalLet) { auto* src = R"( let a : i32 = 1; fn F(a : bool) { } )"; auto* expect = R"( let a : i32 = 1; fn F(a_1 : bool) { } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, ParamShadowsGlobalLet_OutOfOrder) { auto* src = R"( fn F(a : bool) { } let a : i32 = 1; )"; auto* expect = R"( fn F(a_1 : bool) { } let a : i32 = 1; )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, ParamShadowsAlias) { auto* src = R"( type a = i32; fn F(a : a) { { var a = (a == 123); } { let a = (a == 321); } } )"; auto* expect = R"( type a = i32; fn F(a_1 : a) { { var a_2 = (a_1 == 123); } { let a_3 = (a_1 == 321); } } )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } TEST_F(UnshadowTest, ParamShadowsAlias_OutOfOrder) { auto* src = R"( fn F(a : a) { { var a = (a == 123); } { let a = (a == 321); } } type a = i32; )"; auto* expect = R"( fn F(a_1 : a) { { var a_2 = (a_1 == 123); } { let a_3 = (a_1 == 321); } } type a = i32; )"; auto got = Run(src); EXPECT_EQ(expect, str(got)); } } // namespace } // namespace transform } // namespace tint