Properly type-check Expression::Select arguments. (#1442)

Require the `accept` and `reject` arguments to `select` to be scalars or
vectors, per WGSL spec.
This commit is contained in:
Jim Blandy
2021-10-01 09:47:39 -07:00
committed by GitHub
parent ea50486b2d
commit f30f3a3db6
2 changed files with 50 additions and 1 deletions

View File

@@ -795,7 +795,14 @@ impl super::Validator {
Ti::Scalar {
kind: Sk::Bool,
width: _,
} => accept_inner.is_sized(),
} => {
// When `condition` is a single boolean, `accept` and
// `reject` can be vectors or scalars.
match *accept_inner {
Ti::Scalar { .. } | Ti::Vector { .. } => true,
_ => false,
}
}
Ti::Vector {
size,
kind: Sk::Bool,

View File

@@ -945,3 +945,45 @@ fn invalid_runtime_sized_arrays() {
if struct_name == "Outer" && member_name == "unsized"
}
}
#[test]
fn select() {
check_validation_error! {
"
fn select_pointers(which: bool) -> i32 {
var x: i32 = 1;
var y: i32 = 2;
let ptr = select(&x, &y, which);
return *ptr;
}
",
"
fn select_arrays(which: bool) -> i32 {
var x: array<i32, 4>;
var y: array<i32, 4>;
let s = select(x, y, which);
return s[0];
}
",
"
struct S { member: i32; };
fn select_structs(which: bool) -> S {
var x: S = S(1);
var y: S = S(2);
let s = select(x, y, which);
return s;
}
":
Err(
naga::valid::ValidationError::Function {
name,
error: naga::valid::FunctionError::Expression {
error: naga::valid::ExpressionError::InvalidSelectTypes,
..
},
..
},
)
if name.starts_with("select_")
}
}