mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-14 16:09:17 +00:00
Unsuffixed integer literals are currently treated as i32, but will shortly become AbstractInteger. To keep tests behaving identically to how they are currently, change all test literals to using either 'i' or 'u' suffixes. Bug: tint:1504 Change-Id: Ic373d18ce1c718a16b6905568aec89da3641d36b Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/88845 Reviewed-by: Dan Sinclair <dsinclair@chromium.org> Commit-Queue: Ben Clayton <bclayton@google.com>
426 lines
9.3 KiB
C++
426 lines
9.3 KiB
C++
// 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/fold_constants.h"
|
|
|
|
#include <memory>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "src/tint/transform/test_helper.h"
|
|
|
|
namespace tint::transform {
|
|
namespace {
|
|
|
|
using FoldConstantsTest = TransformTest;
|
|
|
|
TEST_F(FoldConstantsTest, Module_Scalar_NoConversion) {
|
|
auto* src = R"(
|
|
var<private> a : i32 = i32(123);
|
|
var<private> b : u32 = u32(123u);
|
|
var<private> c : f32 = f32(123.0);
|
|
var<private> d : bool = bool(true);
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
var<private> a : i32 = 123i;
|
|
|
|
var<private> b : u32 = 123u;
|
|
|
|
var<private> c : f32 = 123.0;
|
|
|
|
var<private> d : bool = true;
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Module_Scalar_Conversion) {
|
|
auto* src = R"(
|
|
var<private> a : i32 = i32(123.0);
|
|
var<private> b : u32 = u32(123);
|
|
var<private> c : f32 = f32(123u);
|
|
var<private> d : bool = bool(123);
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
var<private> a : i32 = 123i;
|
|
|
|
var<private> b : u32 = 123u;
|
|
|
|
var<private> c : f32 = 123.0;
|
|
|
|
var<private> d : bool = true;
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Module_Scalar_MultipleConversions) {
|
|
auto* src = R"(
|
|
var<private> a : i32 = i32(u32(f32(u32(i32(123.0)))));
|
|
var<private> b : u32 = u32(i32(f32(i32(u32(123)))));
|
|
var<private> c : f32 = f32(u32(i32(u32(f32(123u)))));
|
|
var<private> d : bool = bool(i32(f32(i32(u32(123)))));
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
var<private> a : i32 = 123i;
|
|
|
|
var<private> b : u32 = 123u;
|
|
|
|
var<private> c : f32 = 123.0;
|
|
|
|
var<private> d : bool = true;
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Module_Vector_NoConversion) {
|
|
auto* src = R"(
|
|
var<private> a : vec3<i32> = vec3<i32>(123);
|
|
var<private> b : vec3<u32> = vec3<u32>(123u);
|
|
var<private> c : vec3<f32> = vec3<f32>(123.0);
|
|
var<private> d : vec3<bool> = vec3<bool>(true);
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
var<private> a : vec3<i32> = vec3<i32>(123i);
|
|
|
|
var<private> b : vec3<u32> = vec3<u32>(123u);
|
|
|
|
var<private> c : vec3<f32> = vec3<f32>(123.0);
|
|
|
|
var<private> d : vec3<bool> = vec3<bool>(true);
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Module_Vector_Conversion) {
|
|
auto* src = R"(
|
|
var<private> a : vec3<i32> = vec3<i32>(vec3<f32>(123.0));
|
|
var<private> b : vec3<u32> = vec3<u32>(vec3<i32>(123));
|
|
var<private> c : vec3<f32> = vec3<f32>(vec3<u32>(123u));
|
|
var<private> d : vec3<bool> = vec3<bool>(vec3<i32>(123));
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
var<private> a : vec3<i32> = vec3<i32>(123i);
|
|
|
|
var<private> b : vec3<u32> = vec3<u32>(123u);
|
|
|
|
var<private> c : vec3<f32> = vec3<f32>(123.0);
|
|
|
|
var<private> d : vec3<bool> = vec3<bool>(true);
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Module_Vector_MultipleConversions) {
|
|
auto* src = R"(
|
|
var<private> a : vec3<i32> = vec3<i32>(vec3<u32>(vec3<f32>(vec3<u32>(u32(123.0)))));
|
|
var<private> b : vec3<u32> = vec3<u32>(vec3<i32>(vec3<f32>(vec3<i32>(i32(123)))));
|
|
var<private> c : vec3<f32> = vec3<f32>(vec3<u32>(vec3<i32>(vec3<u32>(u32(123u)))));
|
|
var<private> d : vec3<bool> = vec3<bool>(vec3<i32>(vec3<f32>(vec3<i32>(i32(123)))));
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
var<private> a : vec3<i32> = vec3<i32>(123i);
|
|
|
|
var<private> b : vec3<u32> = vec3<u32>(123u);
|
|
|
|
var<private> c : vec3<f32> = vec3<f32>(123.0);
|
|
|
|
var<private> d : vec3<bool> = vec3<bool>(true);
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Module_Vector_MixedSizeConversions) {
|
|
auto* src = R"(
|
|
var<private> a : vec4<i32> = vec4<i32>(vec3<i32>(vec3<u32>(1u, 2u, 3u)), 4);
|
|
var<private> b : vec4<i32> = vec4<i32>(vec2<i32>(vec2<u32>(1u, 2u)), vec2<i32>(4, 5));
|
|
var<private> c : vec4<i32> = vec4<i32>(1, vec2<i32>(vec2<f32>(2.0, 3.0)), 4);
|
|
var<private> d : vec4<i32> = vec4<i32>(1, 2, vec2<i32>(vec2<f32>(3.0, 4.0)));
|
|
var<private> e : vec4<bool> = vec4<bool>(false, bool(f32(1.0)), vec2<bool>(vec2<i32>(0, i32(4u))));
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
var<private> a : vec4<i32> = vec4<i32>(1i, 2i, 3i, 4i);
|
|
|
|
var<private> b : vec4<i32> = vec4<i32>(1i, 2i, 4i, 5i);
|
|
|
|
var<private> c : vec4<i32> = vec4<i32>(1i, 2i, 3i, 4i);
|
|
|
|
var<private> d : vec4<i32> = vec4<i32>(1i, 2i, 3i, 4i);
|
|
|
|
var<private> e : vec4<bool> = vec4<bool>(false, true, false, true);
|
|
|
|
fn f() {
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Function_Scalar_NoConversion) {
|
|
auto* src = R"(
|
|
fn f() {
|
|
var a : i32 = i32(123);
|
|
var b : u32 = u32(123u);
|
|
var c : f32 = f32(123.0);
|
|
var d : bool = bool(true);
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
fn f() {
|
|
var a : i32 = 123i;
|
|
var b : u32 = 123u;
|
|
var c : f32 = 123.0;
|
|
var d : bool = true;
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Function_Scalar_Conversion) {
|
|
auto* src = R"(
|
|
fn f() {
|
|
var a : i32 = i32(123.0);
|
|
var b : u32 = u32(123);
|
|
var c : f32 = f32(123u);
|
|
var d : bool = bool(123);
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
fn f() {
|
|
var a : i32 = 123i;
|
|
var b : u32 = 123u;
|
|
var c : f32 = 123.0;
|
|
var d : bool = true;
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Function_Scalar_MultipleConversions) {
|
|
auto* src = R"(
|
|
fn f() {
|
|
var a : i32 = i32(u32(f32(u32(i32(123.0)))));
|
|
var b : u32 = u32(i32(f32(i32(u32(123)))));
|
|
var c : f32 = f32(u32(i32(u32(f32(123u)))));
|
|
var d : bool = bool(i32(f32(i32(u32(123)))));
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
fn f() {
|
|
var a : i32 = 123i;
|
|
var b : u32 = 123u;
|
|
var c : f32 = 123.0;
|
|
var d : bool = true;
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Function_Vector_NoConversion) {
|
|
auto* src = R"(
|
|
fn f() {
|
|
var a : vec3<i32> = vec3<i32>(123i);
|
|
var b : vec3<u32> = vec3<u32>(123u);
|
|
var c : vec3<f32> = vec3<f32>(123.0);
|
|
var d : vec3<bool> = vec3<bool>(true);
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
fn f() {
|
|
var a : vec3<i32> = vec3<i32>(123i);
|
|
var b : vec3<u32> = vec3<u32>(123u);
|
|
var c : vec3<f32> = vec3<f32>(123.0);
|
|
var d : vec3<bool> = vec3<bool>(true);
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Function_Vector_Conversion) {
|
|
auto* src = R"(
|
|
fn f() {
|
|
var a : vec3<i32> = vec3<i32>(vec3<f32>(123.0));
|
|
var b : vec3<u32> = vec3<u32>(vec3<i32>(123));
|
|
var c : vec3<f32> = vec3<f32>(vec3<u32>(123u));
|
|
var d : vec3<bool> = vec3<bool>(vec3<i32>(123));
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
fn f() {
|
|
var a : vec3<i32> = vec3<i32>(123i);
|
|
var b : vec3<u32> = vec3<u32>(123u);
|
|
var c : vec3<f32> = vec3<f32>(123.0);
|
|
var d : vec3<bool> = vec3<bool>(true);
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Function_Vector_MultipleConversions) {
|
|
auto* src = R"(
|
|
fn f() {
|
|
var a : vec3<i32> = vec3<i32>(vec3<u32>(vec3<f32>(vec3<u32>(u32(123.0)))));
|
|
var b : vec3<u32> = vec3<u32>(vec3<i32>(vec3<f32>(vec3<i32>(i32(123)))));
|
|
var c : vec3<f32> = vec3<f32>(vec3<u32>(vec3<i32>(vec3<u32>(u32(123u)))));
|
|
var d : vec3<bool> = vec3<bool>(vec3<i32>(vec3<f32>(vec3<i32>(i32(123)))));
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
fn f() {
|
|
var a : vec3<i32> = vec3<i32>(123i);
|
|
var b : vec3<u32> = vec3<u32>(123u);
|
|
var c : vec3<f32> = vec3<f32>(123.0);
|
|
var d : vec3<bool> = vec3<bool>(true);
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Function_Vector_MixedSizeConversions) {
|
|
auto* src = R"(
|
|
fn f() {
|
|
var a : vec4<i32> = vec4<i32>(vec3<i32>(vec3<u32>(1u, 2u, 3u)), 4);
|
|
var b : vec4<i32> = vec4<i32>(vec2<i32>(vec2<u32>(1u, 2u)), vec2<i32>(4, 5));
|
|
var c : vec4<i32> = vec4<i32>(1, vec2<i32>(vec2<f32>(2.0, 3.0)), 4);
|
|
var d : vec4<i32> = vec4<i32>(1, 2, vec2<i32>(vec2<f32>(3.0, 4.0)));
|
|
var e : vec4<bool> = vec4<bool>(false, bool(f32(1.0)), vec2<bool>(vec2<i32>(0, i32(4u))));
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
fn f() {
|
|
var a : vec4<i32> = vec4<i32>(1i, 2i, 3i, 4i);
|
|
var b : vec4<i32> = vec4<i32>(1i, 2i, 4i, 5i);
|
|
var c : vec4<i32> = vec4<i32>(1i, 2i, 3i, 4i);
|
|
var d : vec4<i32> = vec4<i32>(1i, 2i, 3i, 4i);
|
|
var e : vec4<bool> = vec4<bool>(false, true, false, true);
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
TEST_F(FoldConstantsTest, Function_Vector_ConstantWithNonConstant) {
|
|
auto* src = R"(
|
|
fn f() {
|
|
var a : f32 = f32();
|
|
var b : vec2<f32> = vec2<f32>(f32(i32(1)), a);
|
|
}
|
|
)";
|
|
|
|
auto* expect = R"(
|
|
fn f() {
|
|
var a : f32 = f32();
|
|
var b : vec2<f32> = vec2<f32>(1.0, a);
|
|
}
|
|
)";
|
|
|
|
auto got = Run<FoldConstants>(src);
|
|
|
|
EXPECT_EQ(expect, str(got));
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace tint::transform
|