Resolver: validate else condition is boolean

Bug: tint:786
Change-Id: I5e4987e4eeb0608c640fc5c8ea035c8dca0ef187
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/50461
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
This commit is contained in:
Antonio Maiorano 2021-05-10 13:46:06 +00:00 committed by Commit Bot service account
parent 6a56744b55
commit 9fdfa1e323
3 changed files with 24 additions and 1 deletions

View File

@ -1196,6 +1196,15 @@ bool Resolver::IfStatement(ast::IfStatement* stmt) {
if (!Expression(cond)) {
return false;
}
auto* else_cond_type = TypeOf(cond)->UnwrapAll();
if (else_cond_type != builder_->ty.bool_()) {
diagnostics_.add_error(
"else statement condition must be bool, got " +
else_cond_type->FriendlyName(builder_->Symbols()),
cond->source());
return false;
}
}
Mark(else_stmt->body());
if (!BlockStatement(else_stmt->body())) {

View File

@ -125,7 +125,7 @@ TEST_F(ResolverTest, Stmt_If) {
auto* else_body = Block(Assign(else_lhs, else_rhs));
auto* else_cond = Expr(3);
auto* else_cond = Expr(true);
auto* else_stmt = create<ast::ElseStatement>(else_cond, else_body);
auto* lhs = Expr("v");

View File

@ -147,6 +147,20 @@ TEST_F(ResolverValidationTest, Stmt_If_NonBool) {
"12:34 error: if statement condition must be bool, got f32");
}
TEST_F(ResolverValidationTest, Stmt_Else_NonBool) {
// else (1.23f) {}
WrapInFunction(If(Expr(true), Block(),
Else(create<ast::ScalarConstructorExpression>(
Source{{12, 34}}, Literal(1.23f)),
Block())));
EXPECT_FALSE(r()->Resolve());
EXPECT_EQ(r()->error(),
"12:34 error: else statement condition must be bool, got f32");
}
TEST_F(ResolverValidationTest,
Stmt_VariableDecl_MismatchedTypeScalarConstructor) {
u32 unsigned_value = 2u; // Type does not match variable type