@@ -129,6 +129,9 @@ pub enum ExpressionError {
129129 WrongArgumentCount ( crate :: MathFunction ) ,
130130 #[ error( "Argument [{1}] to {0:?} as expression {2:?} has an invalid type." ) ]
131131 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 > ) ,
132135 #[ error(
133136 "workgroupUniformLoad result type can't be {0:?}. It can only be a constructible type."
134137 ) ]
@@ -926,47 +929,32 @@ impl super::Validator {
926929 accept,
927930 reject,
928931 } => {
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) ) ;
943955 }
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- } ) ;
969956 }
957+
970958 ShaderStages :: all ( )
971959 }
972960 E :: Derivative { expr, .. } => {
0 commit comments