@@ -433,7 +433,6 @@ impl GenTerminator<StructureLabel<StmtOrDecl>> {
433433pub struct SwitchCases {
434434 cases : Vec < ( Pat , Label ) > ,
435435 default : Option < Label > ,
436- #[ allow( unused) ]
437436 override_type_id : Option < CQualTypeId > ,
438437}
439438
@@ -1868,15 +1867,34 @@ impl CfgBuilder {
18681867 } ) ?;
18691868
18701869 let expr = translator
1871- . convert_expr ( ctx. const_ ( ) . pattern ( ) . used ( ) , case_expr, None )
1870+ . convert_expr (
1871+ ctx. const_ ( ) . pattern ( ) . used ( ) ,
1872+ case_expr,
1873+ switch_case. override_type_id ,
1874+ )
18721875 . ok ( )
18731876 . and_then ( WithStmts :: to_pure_expr) ;
1874- let pat = expr
1875- . and_then ( |expr| expr_to_pat ( * expr) )
1876- . unwrap_or_else ( || match cie {
1877+ let pat = expr. and_then ( |expr| expr_to_pat ( * expr) ) . unwrap_or_else ( || {
1878+ let mut pat = match cie {
18771879 ConstIntExpr :: U ( n) => mk ( ) . lit_pat ( mk ( ) . int_unsuffixed_lit ( n) ) ,
18781880 ConstIntExpr :: I ( n) => mk ( ) . lit_pat ( mk ( ) . int_unsuffixed_lit ( n) ) ,
1879- } ) ;
1881+ } ;
1882+
1883+ if let Some ( override_ty) = switch_case. override_type_id {
1884+ if let CTypeKind :: Enum ( enum_id) =
1885+ translator. ast_context . resolve_type ( override_ty. ctype ) . kind
1886+ {
1887+ let enum_name = translator
1888+ . type_converter
1889+ . borrow ( )
1890+ . resolve_decl_name ( enum_id)
1891+ . unwrap ( ) ;
1892+ pat = mk ( ) . tuple_struct_pat ( enum_name. as_str ( ) , None , vec ! [ pat] ) ;
1893+ }
1894+ }
1895+
1896+ pat
1897+ } ) ;
18801898
18811899 switch_case. cases . push ( ( pat, this_label. clone ( ) ) ) ;
18821900
@@ -1947,7 +1965,7 @@ impl CfgBuilder {
19471965 }
19481966
19491967 let ( stmts, val) = translator
1950- . convert_expr ( ctx. used ( ) , scrutinee, None ) ?
1968+ . convert_expr ( ctx. used ( ) , scrutinee, override_type_id ) ?
19511969 . discard_unsafe ( ) ;
19521970 wip. extend ( stmts) ;
19531971
0 commit comments