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>
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc
index 78f91fa..658fca8 100644
--- a/src/resolver/resolver.cc
+++ b/src/resolver/resolver.cc
@@ -1196,6 +1196,15 @@
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())) {
diff --git a/src/resolver/resolver_test.cc b/src/resolver/resolver_test.cc
index 88cfbb6..1d6f22f 100644
--- a/src/resolver/resolver_test.cc
+++ b/src/resolver/resolver_test.cc
@@ -125,7 +125,7 @@
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");
diff --git a/src/resolver/validation_test.cc b/src/resolver/validation_test.cc
index 4ffb660..6ad9df8 100644
--- a/src/resolver/validation_test.cc
+++ b/src/resolver/validation_test.cc
@@ -147,6 +147,20 @@
"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