From fe484b3a1ba4c6a6bffebe4f12ed3168ed87bee0 Mon Sep 17 00:00:00 2001 From: Jim Blandy Date: Sun, 8 Oct 2023 13:53:05 -0700 Subject: [PATCH] Require that `Function` and `Private` variables be `CONSTRUCTIBLE`. Change the validator to enforce WGSL's requirement that all variables in the `function` and `private` address spaces must have constructible types. Mark the `RayQuery` type as `CONSTRUCTIBLE`, since it is intended to be used for local variables. Add a regression test. --- src/valid/function.rs | 5 +---- src/valid/interface.rs | 5 ++--- src/valid/type.rs | 5 ++++- tests/wgsl-errors.rs | 17 +++++++++++++++++ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/valid/function.rs b/src/valid/function.rs index 06aa27c84b..998f873c08 100644 --- a/src/valid/function.rs +++ b/src/valid/function.rs @@ -948,10 +948,7 @@ impl super::Validator { .types .get(var.ty.index()) .ok_or(LocalVariableError::InvalidType(var.ty))?; - if !type_info - .flags - .contains(super::TypeFlags::DATA | super::TypeFlags::SIZED) - { + if !type_info.flags.contains(super::TypeFlags::CONSTRUCTIBLE) { return Err(LocalVariableError::InvalidType(var.ty)); } diff --git a/src/valid/interface.rs b/src/valid/interface.rs index ef88a46a86..7c6c5244e4 100644 --- a/src/valid/interface.rs +++ b/src/valid/interface.rs @@ -541,9 +541,8 @@ impl super::Validator { (TypeFlags::empty(), true) } - crate::AddressSpace::Private | crate::AddressSpace::WorkGroup => { - (TypeFlags::DATA | TypeFlags::SIZED, false) - } + crate::AddressSpace::Private => (TypeFlags::CONSTRUCTIBLE, false), + crate::AddressSpace::WorkGroup => (TypeFlags::DATA | TypeFlags::SIZED, false), crate::AddressSpace::PushConstant => { if !self.capabilities.contains(Capabilities::PUSH_CONSTANT) { return Err(GlobalVariableError::UnsupportedCapability( diff --git a/src/valid/type.rs b/src/valid/type.rs index f8ceb463c6..c0d8a12956 100644 --- a/src/valid/type.rs +++ b/src/valid/type.rs @@ -566,7 +566,10 @@ impl super::Validator { } Ti::RayQuery => { self.require_type_capability(Capabilities::RAY_QUERY)?; - TypeInfo::new(TypeFlags::DATA | TypeFlags::SIZED, Alignment::ONE) + TypeInfo::new( + TypeFlags::DATA | TypeFlags::CONSTRUCTIBLE | TypeFlags::SIZED, + Alignment::ONE, + ) } Ti::BindingArray { base, size } => { if base >= handle { diff --git a/tests/wgsl-errors.rs b/tests/wgsl-errors.rs index b164f69557..cbab660269 100644 --- a/tests/wgsl-errors.rs +++ b/tests/wgsl-errors.rs @@ -1342,6 +1342,23 @@ fn invalid_local_vars() { }) if local_var_name == "not_okay" } + + check_validation! { + " + fn f() { + var x: atomic; + } + ": + Err(naga::valid::ValidationError::Function { + source: naga::valid::FunctionError::LocalVariable { + name: local_var_name, + source: naga::valid::LocalVariableError::InvalidType(_), + .. + }, + .. + }) + if local_var_name == "x" + } } #[test]