validation: fix error msg for assign to 'let' and 'function parameter'
Bug: tint:903 Change-Id: Ie2220d533f2227be717f61fa702514e2aeb052c8 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/56300 Reviewed-by: Antonio Maiorano <amaiorano@google.com> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
parent
e37044a6cc
commit
cb0309ed6c
|
@ -173,7 +173,8 @@ TEST_F(ResolverAssignmentValidationTest, AssignToConstant_Fail) {
|
||||||
WrapInFunction(var, Assign(Expr(Source{{12, 34}}, "a"), 2));
|
WrapInFunction(var, Assign(Expr(Source{{12, 34}}, "a"), 2));
|
||||||
|
|
||||||
EXPECT_FALSE(r()->Resolve());
|
EXPECT_FALSE(r()->Resolve());
|
||||||
EXPECT_EQ(r()->error(), "12:34 error: cannot assign to value of type 'i32'");
|
EXPECT_EQ(r()->error(),
|
||||||
|
"12:34 error: cannot assign to const\nnote: 'a' is declared here:");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ResolverAssignmentValidationTest, AssignNonStorable_Fail) {
|
TEST_F(ResolverAssignmentValidationTest, AssignNonStorable_Fail) {
|
||||||
|
|
|
@ -354,7 +354,9 @@ TEST_F(ResolverFunctionValidationTest, FunctionParamsConst) {
|
||||||
{Assign(Expr(Source{{12, 34}}, "arg"), Expr(1)), Return()});
|
{Assign(Expr(Source{{12, 34}}, "arg"), Expr(1)), Return()});
|
||||||
|
|
||||||
EXPECT_FALSE(r()->Resolve());
|
EXPECT_FALSE(r()->Resolve());
|
||||||
EXPECT_EQ(r()->error(), "12:34 error: cannot assign to value of type 'i32'");
|
EXPECT_EQ(r()->error(),
|
||||||
|
"12:34 error: cannot assign to function parameter\nnote: 'arg' is "
|
||||||
|
"declared here:");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ResolverFunctionValidationTest, WorkgroupSize_Literal_BadType) {
|
TEST_F(ResolverFunctionValidationTest, WorkgroupSize_Literal_BadType) {
|
||||||
|
|
|
@ -3670,12 +3670,31 @@ bool Resolver::ValidateAssignment(const ast::AssignmentStatement* a) {
|
||||||
auto const* lhs_type = TypeOf(a->lhs());
|
auto const* lhs_type = TypeOf(a->lhs());
|
||||||
auto const* rhs_type = TypeOf(a->rhs());
|
auto const* rhs_type = TypeOf(a->rhs());
|
||||||
|
|
||||||
|
if (auto* ident = a->lhs()->As<ast::IdentifierExpression>()) {
|
||||||
|
VariableInfo* var;
|
||||||
|
if (variable_stack_.get(ident->symbol(), &var)) {
|
||||||
|
if (var->kind == VariableKind::kParameter) {
|
||||||
|
AddError("cannot assign to function parameter", a->lhs()->source());
|
||||||
|
AddNote("'" + builder_->Symbols().NameFor(ident->symbol()) +
|
||||||
|
"' is declared here:",
|
||||||
|
var->declaration->source());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (var->declaration->is_const()) {
|
||||||
|
AddError("cannot assign to const", a->lhs()->source());
|
||||||
|
AddNote("'" + builder_->Symbols().NameFor(ident->symbol()) +
|
||||||
|
"' is declared here:",
|
||||||
|
var->declaration->source());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto* lhs_ref = lhs_type->As<sem::Reference>();
|
auto* lhs_ref = lhs_type->As<sem::Reference>();
|
||||||
if (!lhs_ref) {
|
if (!lhs_ref) {
|
||||||
// LHS is not a reference, so it has no storage.
|
// LHS is not a reference, so it has no storage.
|
||||||
AddError("cannot assign to value of type '" + TypeNameOf(a->lhs()) + "'",
|
AddError("cannot assign to value of type '" + TypeNameOf(a->lhs()) + "'",
|
||||||
a->lhs()->source());
|
a->lhs()->source());
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue