@@ -563,6 +563,8 @@ pub enum ConstantEvaluatorError {
563563 RuntimeExpr ,
564564 #[ error( "Unexpected override-expression" ) ]
565565 OverrideExpr ,
566+ #[ error( "Expected boolean expression for condition argument of `select`" ) ]
567+ SelectConditionNotABool ,
566568}
567569
568570impl < ' a > ConstantEvaluator < ' a > {
@@ -904,9 +906,46 @@ impl<'a> ConstantEvaluator<'a> {
904906 ) ) ,
905907 }
906908 }
907- Expression :: Select { .. } => Err ( ConstantEvaluatorError :: NotImplemented (
908- "select built-in function" . into ( ) ,
909- ) ) ,
909+ Expression :: Select {
910+ reject,
911+ accept,
912+ condition,
913+ } => {
914+ std:: eprintln!( "lolwat" ) ;
915+ let val_arg = |this : & mut Self , expr| {
916+ let expr = this. check_and_get ( expr) ?;
917+ this. eval_zero_value_and_splat ( expr, span)
918+ } ;
919+
920+ let reject = val_arg ( self , reject) ?;
921+ let Some ( reject_scalar) = ( match std:: dbg!( & self . expressions[ reject] ) {
922+ & Expression :: Literal ( lit) => Some ( lit. scalar ( ) ) ,
923+ & Expression :: Compose { ty, .. } => std:: dbg!( & self . types[ ty] . inner)
924+ . vector_size_and_scalar ( )
925+ . map ( |( _size, scalar) | scalar) ,
926+ _ => None ,
927+ } ) else {
928+ return Err ( ConstantEvaluatorError :: InvalidMathArg ) ;
929+ } ;
930+
931+ let reject = self . cast ( reject, std:: dbg!( reject_scalar) , span) ?;
932+ let accept = {
933+ let accept = val_arg ( self , accept) ?;
934+ self . cast ( accept, reject_scalar, span) ?
935+ } ;
936+ let condition = self . check_and_get ( condition) ?;
937+ let condition = match & self . expressions [ condition] {
938+ & Expression :: Literal ( Literal :: Bool ( bool) ) => bool,
939+ _ => return Err ( ConstantEvaluatorError :: SelectConditionNotABool ) ,
940+ } ;
941+ component_wise_scalar ! ( self , span, [ reject, accept] , |reject, accept| {
942+ if condition {
943+ Ok ( [ accept] )
944+ } else {
945+ Ok ( [ reject] )
946+ }
947+ } )
948+ }
910949 Expression :: Relational { fun, argument } => {
911950 let argument = self . check_and_get ( argument) ?;
912951 self . relational ( fun, argument, span)
0 commit comments