@@ -129,6 +129,9 @@ pub enum ExpressionError {
129
129
WrongArgumentCount ( crate :: MathFunction ) ,
130
130
#[ error( "Argument [{1}] to {0:?} as expression {2:?} has an invalid type." ) ]
131
131
InvalidArgumentType ( crate :: MathFunction , u32 , Handle < crate :: Expression > ) ,
132
+ // TODO: dedupe with above
133
+ #[ error( "Argument [{0}] to `select` as expression {1:?} has an invalid type." ) ]
134
+ InvalidArgumentTypeSelect ( u32 , Handle < crate :: Expression > ) ,
132
135
#[ error(
133
136
"workgroupUniformLoad result type can't be {0:?}. It can only be a constructible type."
134
137
) ]
@@ -926,47 +929,32 @@ impl super::Validator {
926
929
accept,
927
930
reject,
928
931
} => {
929
- let accept_inner = & resolver[ accept] ;
930
- let reject_inner = & resolver[ reject] ;
931
- let condition_ty = & resolver[ condition] ;
932
- let condition_good = match * condition_ty {
933
- Ti :: Scalar ( Sc {
934
- kind : Sk :: Bool ,
935
- width : _,
936
- } ) => {
937
- // When `condition` is a single boolean, `accept` and
938
- // `reject` can be vectors or scalars.
939
- match * accept_inner {
940
- Ti :: Scalar { .. } | Ti :: Vector { .. } => true ,
941
- _ => false ,
942
- }
932
+ // TODO: dedupe with math functions
933
+
934
+ let mut overloads = crate :: proc:: select ( ) ;
935
+ log:: debug!(
936
+ "initial overloads for `select`: {:#?}" ,
937
+ overloads. for_debug( & module. types)
938
+ ) ;
939
+
940
+ for ( i, ( expr, ty) ) in [ reject, accept, condition]
941
+ . iter ( )
942
+ . copied ( )
943
+ . map ( |arg| ( arg, & resolver[ arg] ) )
944
+ . enumerate ( )
945
+ {
946
+ overloads = overloads. arg ( i, ty, & module. types ) ;
947
+ log:: debug!(
948
+ "overloads after arg {i}: {:#?}" ,
949
+ overloads. for_debug( & module. types)
950
+ ) ;
951
+
952
+ if overloads. is_empty ( ) {
953
+ log:: debug!( "all overloads eliminated" ) ;
954
+ return Err ( ExpressionError :: InvalidArgumentTypeSelect ( i as u32 , expr) ) ;
943
955
}
944
- Ti :: Vector {
945
- size,
946
- scalar :
947
- Sc {
948
- kind : Sk :: Bool ,
949
- width : _,
950
- } ,
951
- } => match * accept_inner {
952
- Ti :: Vector {
953
- size : other_size, ..
954
- } => size == other_size,
955
- _ => false ,
956
- } ,
957
- _ => false ,
958
- } ;
959
- if accept_inner != reject_inner {
960
- return Err ( ExpressionError :: SelectValuesTypeMismatch {
961
- accept : accept_inner. clone ( ) ,
962
- reject : reject_inner. clone ( ) ,
963
- } ) ;
964
- }
965
- if !condition_good {
966
- return Err ( ExpressionError :: SelectConditionNotABool {
967
- actual : condition_ty. clone ( ) ,
968
- } ) ;
969
956
}
957
+
970
958
ShaderStages :: all ( )
971
959
}
972
960
E :: Derivative { expr, .. } => {
0 commit comments