From ff69053bf28857c6f00aedbe044ce144f96c7c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Wed, 7 Sep 2022 23:34:39 +0100 Subject: [PATCH] valid: Check regular functions don't have bindings Checks that all arguments and return types have no bindings in regular functions. --- src/valid/function.rs | 17 +++++++++++++++++ src/valid/interface.rs | 2 +- src/valid/mod.rs | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/valid/function.rs b/src/valid/function.rs index 67903601c6..db66a0f6ce 100644 --- a/src/valid/function.rs +++ b/src/valid/function.rs @@ -143,6 +143,10 @@ pub enum FunctionError { Handle, UniformityDisruptor, ), + #[error("Functions that are not entry points cannot have `@location` or `@builtin` attributes on their arguments: \"{name}\" has attributes")] + PipelineInputRegularFunction { name: String }, + #[error("Functions that are not entry points cannot have `@location` or `@builtin` attributes on their return value types")] + PipelineOutputRegularFunction, } bitflags::bitflags! { @@ -859,6 +863,7 @@ impl super::Validator { fun: &crate::Function, module: &crate::Module, mod_info: &ModuleInfo, + entry_point: bool, ) -> Result> { #[cfg_attr(not(feature = "validate"), allow(unused_mut))] let mut info = mod_info.process_function(fun, module, self.flags, self.capabilities)?; @@ -909,6 +914,13 @@ impl super::Validator { } .with_span_handle(argument.ty, &module.types)); } + + if !entry_point && argument.binding.is_some() { + return Err(FunctionError::PipelineInputRegularFunction { + name: argument.name.clone().unwrap_or_default(), + } + .with_span_handle(argument.ty, &module.types)); + } } #[cfg(feature = "validate")] @@ -920,6 +932,11 @@ impl super::Validator { return Err(FunctionError::NonConstructibleReturnType .with_span_handle(result.ty, &module.types)); } + + if !entry_point && result.binding.is_some() { + return Err(FunctionError::PipelineOutputRegularFunction + .with_span_handle(result.ty, &module.types)); + } } self.valid_expression_set.clear(); diff --git a/src/valid/interface.rs b/src/valid/interface.rs index bee57e877b..072550e9b0 100644 --- a/src/valid/interface.rs +++ b/src/valid/interface.rs @@ -472,7 +472,7 @@ impl super::Validator { } let info = self - .validate_function(&ep.function, module, mod_info) + .validate_function(&ep.function, module, mod_info, true) .map_err(WithSpan::into_other)?; #[cfg(feature = "validate")] diff --git a/src/valid/mod.rs b/src/valid/mod.rs index 60178bb47e..b746f6abd4 100644 --- a/src/valid/mod.rs +++ b/src/valid/mod.rs @@ -373,7 +373,7 @@ impl Validator { }; for (handle, fun) in module.functions.iter() { - match self.validate_function(fun, module, &mod_info) { + match self.validate_function(fun, module, &mod_info, false) { Ok(info) => mod_info.functions.push(info), Err(error) => { return Err(error.and_then(|error| {