@@ -88,8 +88,9 @@ use rustc_hir::HirId;
8888use rustc_index:: { IndexSlice , IndexVec } ;
8989use rustc_middle:: middle:: region;
9090use rustc_middle:: mir:: * ;
91- use rustc_middle:: thir:: { ArmId , ExprId , LintLevel } ;
92- use rustc_middle:: { bug, span_bug} ;
91+ use rustc_middle:: thir:: { AdtExpr , AdtExprBase , ArmId , ExprId , ExprKind , LintLevel } ;
92+ use rustc_middle:: ty:: ValTree ;
93+ use rustc_middle:: { bug, span_bug, ty} ;
9394use rustc_pattern_analysis:: rustc:: RustcPatCtxt ;
9495use rustc_session:: lint:: Level ;
9596use rustc_span:: source_map:: Spanned ;
@@ -824,8 +825,28 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
824825 span_bug ! ( span, "break value must be a scope" )
825826 } ;
826827
827- // FIXME accept bare MyEnum::Foo as constant
828- let constant = self . as_constant ( & self . thir [ value] ) ;
828+ let constant = match & self . thir [ value] . kind {
829+ ExprKind :: Adt ( box AdtExpr { variant_index, fields, base, .. } ) => {
830+ assert ! ( matches!( base, AdtExprBase :: None ) ) ;
831+ assert ! ( fields. is_empty( ) ) ;
832+ ConstOperand {
833+ span : self . thir [ value] . span ,
834+ user_ty : None ,
835+ const_ : Const :: Ty (
836+ self . thir [ value] . ty ,
837+ ty:: Const :: new_value (
838+ self . tcx ,
839+ ValTree :: from_branches (
840+ self . tcx ,
841+ [ ValTree :: from_scalar_int ( self . tcx , variant_index. as_u32 ( ) . into ( ) ) ] ,
842+ ) ,
843+ self . thir [ value] . ty ,
844+ ) ,
845+ ) ,
846+ }
847+ }
848+ _ => self . as_constant ( & self . thir [ value] ) ,
849+ } ;
829850
830851 let break_index = self
831852 . scopes
0 commit comments