@@ -831,3 +831,168 @@ test "peer type resolution on switch captures ignores unused payload bits" {
831831
832832 try expect (x == 123 );
833833}
834+
835+ test "switch on error union catch" {
836+ const S = struct {
837+ fn doTheTest () ! void {
838+ const Error = error { A , B , C };
839+ {
840+ var a : Error ! u64 = 3 ;
841+ _ = & a ;
842+ const b : u64 = a catch | err | switch (err ) {
843+ error .A = > 0 ,
844+ error .B = > @intFromError (err ),
845+ error .C = > @intFromError (err ),
846+ };
847+ try std .testing .expectEqual (@as (u64 , 3 ), b );
848+ }
849+ {
850+ var a : Error ! u64 = 3 ;
851+ _ = & a ;
852+ const b : u64 = a catch | err | switch (err ) {
853+ error .A , error .B = > 0 ,
854+ error .C = > @intFromError (err ),
855+ };
856+ try std .testing .expectEqual (@as (u64 , 3 ), b );
857+ }
858+ {
859+ var a : Error ! u64 = 3 ;
860+ _ = & a ;
861+ const b : u64 = a catch | err | switch (err ) {
862+ error .A = > 0 ,
863+ error .C , error .B = > @intFromError (err ),
864+ };
865+ try std .testing .expectEqual (@as (u64 , 3 ), b );
866+ }
867+ {
868+ var a : Error ! u64 = error .A ;
869+ _ = & a ;
870+ const b : u64 = a catch | err | switch (err ) {
871+ error .A = > 0 ,
872+ error .B = > @intFromError (err ),
873+ error .C = > @intFromError (err ),
874+ };
875+ try std .testing .expectEqual (@as (u64 , 0 ), b );
876+ }
877+ {
878+ var a : Error ! u64 = error .A ;
879+ _ = & a ;
880+ const b : u64 = a catch | err | switch (err ) {
881+ error .A , error .B = > 0 ,
882+ error .C = > @intFromError (err ),
883+ };
884+ try std .testing .expectEqual (@as (u64 , 0 ), b );
885+ }
886+ {
887+ var a : Error ! u64 = error .A ;
888+ _ = & a ;
889+ const b : u64 = a catch | err | switch (err ) {
890+ error .A = > 0 ,
891+ error .C , error .B = > @intFromError (err ),
892+ };
893+ try std .testing .expectEqual (@as (u64 , 0 ), b );
894+ }
895+ {
896+ var a : Error ! u64 = 3 ;
897+ _ = & a ;
898+ const b : u64 = a catch | err | switch (err ) {
899+ error .A = > 0 ,
900+ else = > @intFromError (err ),
901+ };
902+ try std .testing .expectEqual (@as (u64 , 3 ), b );
903+ }
904+ {
905+ var a : Error ! u64 = error .A ;
906+ _ = & a ;
907+ const b : u64 = a catch | err | switch (err ) {
908+ error .A = > 1 ,
909+ else = > @intFromError (err ),
910+ };
911+ try std .testing .expectEqual (@as (u64 , 1 ), b );
912+ }
913+ {
914+ var a : Error ! u64 = error .A ;
915+ _ = & a ;
916+ const b : u64 = a catch | err | switch (err ) {
917+ error .A = > | e | @intFromError (e ),
918+ else = > @intFromError (err ),
919+ };
920+ try std .testing .expectEqual (@as (u64 , @intFromError (error .A )), b );
921+ }
922+ {
923+ var a : Error ! u64 = error .B ;
924+ _ = & a ;
925+ const b : u64 = a catch | err | switch (err ) {
926+ error .A = > 0 ,
927+ else = > @intFromError (err ),
928+ };
929+ try std .testing .expectEqual (@as (u64 , @intFromError (error .B )), b );
930+ }
931+ {
932+ var a : Error ! u64 = error .B ;
933+ _ = & a ;
934+ const b : u64 = a catch | err | switch (err ) {
935+ error .A = > 0 ,
936+ inline else = > @intFromError (err ),
937+ };
938+ try std .testing .expectEqual (@as (u64 , @intFromError (error .B )), b );
939+ }
940+ {
941+ var a : Error ! u64 = error .B ;
942+ _ = & a ;
943+ const b : u64 = a catch | err | switch (err ) {
944+ error .A = > | e | @intFromError (e ),
945+ inline else = > @intFromError (err ),
946+ };
947+ try std .testing .expectEqual (@as (u64 , @intFromError (error .B )), b );
948+ }
949+ {
950+ var a : Error ! u64 = error .B ;
951+ _ = & a ;
952+ const b : u64 = a catch | err | switch (err ) {
953+ error .A = > 0 ,
954+ error .B , error .C = > @intFromError (err ),
955+ };
956+ try std .testing .expectEqual (@as (u64 , @intFromError (error .B )), b );
957+ }
958+ {
959+ var a : Error ! u64 = error .B ;
960+ _ = & a ;
961+ const b : u64 = a catch | err | switch (err ) {
962+ error .A = > 0 ,
963+ error .B , error .C = > | e | @intFromError (e ),
964+ };
965+ try std .testing .expectEqual (@as (u64 , @intFromError (error .B )), b );
966+ }
967+ {
968+ var a : Error ! u64 = error .B ;
969+ _ = & a ;
970+ const b : u64 = a catch | err | switch (err ) {
971+ error .A = > 0 ,
972+ inline error .B , error .C = > | e | @intFromError (e ),
973+ };
974+ try std .testing .expectEqual (@as (u64 , @intFromError (error .B )), b );
975+ }
976+ {
977+ var a : error {}! u64 = 0 ;
978+ _ = & a ;
979+ const b : u64 = a catch | err | switch (err ) {
980+ else = > | e | return e ,
981+ };
982+ try std .testing .expectEqual (@as (u64 , 0 ), b );
983+ }
984+ {
985+ var a : error {}! u64 = 0 ;
986+ _ = & a ;
987+ const b : u64 = a catch | err | switch (err ) {
988+ error .UnknownError = > return error .Fail ,
989+ else = > | e | return e ,
990+ };
991+ try std .testing .expectEqual (@as (u64 , 0 ), b );
992+ }
993+ }
994+ };
995+
996+ try comptime S .doTheTest ();
997+ try S .doTheTest ();
998+ }
0 commit comments