diff --git a/src/lib.rs b/src/lib.rs index 5ab1449fd9..f82e88b4ba 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -676,6 +676,8 @@ pub enum TypeInner { /// User-defined structure. /// + /// There must always be at least one member. + /// /// A `Struct` type is [`DATA`], and the types of its members must be /// `DATA` as well. /// diff --git a/src/valid/type.rs b/src/valid/type.rs index 6eaa689d64..236fde99a8 100644 --- a/src/valid/type.rs +++ b/src/valid/type.rs @@ -120,6 +120,8 @@ pub enum TypeError { size: u32, span: u32, }, + #[error("Structure types must have at least one member")] + EmptyStruct, } // Only makes sense if `flags.contains(HOST_SHARED)` @@ -451,6 +453,10 @@ impl super::Validator { } } Ti::Struct { ref members, span } => { + if members.is_empty() { + return Err(TypeError::EmptyStruct); + } + let mut ti = TypeInfo::new( TypeFlags::DATA | TypeFlags::SIZED diff --git a/tests/wgsl-errors.rs b/tests/wgsl-errors.rs index 71ed5ac91a..9f341ff45c 100644 --- a/tests/wgsl-errors.rs +++ b/tests/wgsl-errors.rs @@ -930,6 +930,14 @@ fn invalid_structs() { .. }) } + + check_validation_error! { + "struct Empty {}": + Err(naga::valid::ValidationError::Type { + error: naga::valid::TypeError::EmptyStruct, + .. + }) + } } #[test]