mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-21 18:59:21 +00:00
tint/validator: Hint 'var' instead of 'const'
Involves expanding the source range of a variable declaration so we can point at something that can include the 'const'. Fixed: tint:1740 Change-Id: Ie8f784de34a1792002aaa708c1b77053be54f1b5 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/108120 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: David Neto <dneto@google.com> Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
committed by
Dawn LUCI CQ
parent
fd9c3fe4bc
commit
9535f72209
@@ -1382,6 +1382,14 @@ bool Validator::EvaluationStage(const sem::Expression* expr,
|
||||
AddError(std::string(constraint) + " requires " + stage_name(latest_stage) +
|
||||
", but expression is " + stage_name(expr->Stage()),
|
||||
expr->Declaration()->source);
|
||||
|
||||
if (auto* stmt = expr->Stmt()) {
|
||||
if (auto* decl = As<ast::VariableDeclStatement>(stmt->Declaration())) {
|
||||
if (decl->variable->Is<ast::Const>()) {
|
||||
AddNote("consider changing 'const' to 'let'", decl->source);
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -417,10 +417,8 @@ TEST_F(ResolverVariableValidationTest, MatrixVarNoType) {
|
||||
EXPECT_EQ(r()->error(), "12:34 error: missing matrix element type");
|
||||
}
|
||||
|
||||
TEST_F(ResolverVariableValidationTest, ConstInitWithVar) {
|
||||
auto* v = Var("v", Expr(1_i));
|
||||
auto* c = Const("c", Expr(Source{{12, 34}}, v));
|
||||
WrapInFunction(v, c);
|
||||
TEST_F(ResolverVariableValidationTest, GlobalConstWithRuntimeExpression) {
|
||||
GlobalConst("c", Call(Source{{12, 34}}, "dpdx", 1._a));
|
||||
|
||||
EXPECT_FALSE(r()->Resolve());
|
||||
EXPECT_EQ(
|
||||
@@ -428,47 +426,64 @@ TEST_F(ResolverVariableValidationTest, ConstInitWithVar) {
|
||||
R"(12:34 error: const initializer requires a const-expression, but expression is a runtime-expression)");
|
||||
}
|
||||
|
||||
TEST_F(ResolverVariableValidationTest, ConstInitWithVar) {
|
||||
auto* v = Var("v", Expr(1_i));
|
||||
auto* c = Const("c", Expr(Source{{12, 34}}, v));
|
||||
WrapInFunction(v, Decl(Source{{56, 78}}, c));
|
||||
|
||||
EXPECT_FALSE(r()->Resolve());
|
||||
EXPECT_EQ(
|
||||
r()->error(),
|
||||
R"(12:34 error: const initializer requires a const-expression, but expression is a runtime-expression
|
||||
56:78 note: consider changing 'const' to 'let')");
|
||||
}
|
||||
|
||||
TEST_F(ResolverVariableValidationTest, ConstInitWithOverride) {
|
||||
auto* o = Override("v", Expr(1_i));
|
||||
auto* c = Const("c", Expr(Source{{12, 34}}, o));
|
||||
WrapInFunction(c);
|
||||
WrapInFunction(Decl(Source{{56, 78}}, c));
|
||||
|
||||
EXPECT_FALSE(r()->Resolve());
|
||||
EXPECT_EQ(
|
||||
r()->error(),
|
||||
R"(12:34 error: const initializer requires a const-expression, but expression is an override-expression)");
|
||||
R"(12:34 error: const initializer requires a const-expression, but expression is an override-expression
|
||||
56:78 note: consider changing 'const' to 'let')");
|
||||
}
|
||||
|
||||
TEST_F(ResolverVariableValidationTest, ConstInitWithLet) {
|
||||
auto* l = Let("v", Expr(1_i));
|
||||
auto* c = Const("c", Expr(Source{{12, 34}}, l));
|
||||
WrapInFunction(l, c);
|
||||
WrapInFunction(l, Decl(Source{{56, 78}}, c));
|
||||
|
||||
EXPECT_FALSE(r()->Resolve());
|
||||
EXPECT_EQ(
|
||||
r()->error(),
|
||||
R"(12:34 error: const initializer requires a const-expression, but expression is a runtime-expression)");
|
||||
R"(12:34 error: const initializer requires a const-expression, but expression is a runtime-expression
|
||||
56:78 note: consider changing 'const' to 'let')");
|
||||
}
|
||||
|
||||
TEST_F(ResolverVariableValidationTest, ConstInitWithRuntimeExpr) {
|
||||
// const c = clamp(2, dpdx(0.5), 3);
|
||||
WrapInFunction(Const("c", Call("clamp", 2_a, Call(Source{{12, 34}}, "dpdx", 0.5_a), 3_a)));
|
||||
auto* c = Const("c", Call("clamp", 2_a, Call(Source{{12, 34}}, "dpdx", 0.5_a), 3_a));
|
||||
WrapInFunction(Decl(Source{{56, 78}}, c));
|
||||
|
||||
EXPECT_FALSE(r()->Resolve());
|
||||
EXPECT_EQ(
|
||||
r()->error(),
|
||||
R"(12:34 error: const initializer requires a const-expression, but expression is a runtime-expression)");
|
||||
R"(12:34 error: const initializer requires a const-expression, but expression is a runtime-expression
|
||||
56:78 note: consider changing 'const' to 'let')");
|
||||
}
|
||||
|
||||
TEST_F(ResolverVariableValidationTest, ConstInitWithOverrideExpr) {
|
||||
auto* o = Override("v", Expr(1_i));
|
||||
auto* c = Const("c", Add(10_a, Expr(Source{{12, 34}}, o)));
|
||||
WrapInFunction(c);
|
||||
WrapInFunction(Decl(Source{{56, 78}}, c));
|
||||
|
||||
EXPECT_FALSE(r()->Resolve());
|
||||
EXPECT_EQ(
|
||||
r()->error(),
|
||||
R"(12:34 error: const initializer requires a const-expression, but expression is an override-expression)");
|
||||
R"(12:34 error: const initializer requires a const-expression, but expression is an override-expression
|
||||
56:78 note: consider changing 'const' to 'let')");
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Reference in New Issue
Block a user