diff --git a/src/valid/expression.rs b/src/valid/expression.rs index 547cef2b98..0295e2c851 100644 --- a/src/valid/expression.rs +++ b/src/valid/expression.rs @@ -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, diff --git a/tests/wgsl-errors.rs b/tests/wgsl-errors.rs index 9f4f0711b0..dedd2042d6 100644 --- a/tests/wgsl-errors.rs +++ b/tests/wgsl-errors.rs @@ -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; + var y: array; + 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_") + } +}