@@ -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 ;
@@ -827,8 +828,28 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
827828 span_bug ! ( span, "break value must be a scope" )
828829 } ;
829830
830- // FIXME accept bare MyEnum::Foo as constant
831- let constant = self . as_constant ( & self . thir [ value] ) ;
831+ let constant = match & self . thir [ value] . kind {
832+ ExprKind :: Adt ( box AdtExpr { variant_index, fields, base, .. } ) => {
833+ assert ! ( matches!( base, AdtExprBase :: None ) ) ;
834+ assert ! ( fields. is_empty( ) ) ;
835+ ConstOperand {
836+ span : self . thir [ value] . span ,
837+ user_ty : None ,
838+ const_ : Const :: Ty (
839+ self . thir [ value] . ty ,
840+ ty:: Const :: new_value (
841+ self . tcx ,
842+ ValTree :: from_branches (
843+ self . tcx ,
844+ [ ValTree :: from_scalar_int ( self . tcx , variant_index. as_u32 ( ) . into ( ) ) ] ,
845+ ) ,
846+ self . thir [ value] . ty ,
847+ ) ,
848+ ) ,
849+ }
850+ }
851+ _ => self . as_constant ( & self . thir [ value] ) ,
852+ } ;
832853
833854 let break_index = self
834855 . scopes
0 commit comments