@@ -22,7 +22,7 @@ use rustc::ty::subst::InternalSubsts;
2222use rustc_data_structures:: fx:: FxHashMap ;
2323use rustc_index:: vec:: IndexVec ;
2424use rustc:: ty:: layout:: {
25- LayoutOf , TyLayout , LayoutError , HasTyCtxt , TargetDataLayout , HasDataLayout ,
25+ LayoutOf , TyLayout , LayoutError , HasTyCtxt , TargetDataLayout , HasDataLayout , Size ,
2626} ;
2727
2828use crate :: rustc:: ty:: subst:: Subst ;
@@ -35,6 +35,9 @@ use crate::interpret::{
3535use crate :: const_eval:: error_to_const_error;
3636use crate :: transform:: { MirPass , MirSource } ;
3737
38+ /// The maximum number of bytes that we'll allocate space for a return value.
39+ const MAX_ALLOC_LIMIT : u64 = 1024 ;
40+
3841pub struct ConstProp ;
3942
4043impl < ' tcx > MirPass < ' tcx > for ConstProp {
@@ -313,8 +316,10 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
313316 ecx
314317 . layout_of ( body. return_ty ( ) . subst ( tcx, substs) )
315318 . ok ( )
316- // Don't bother allocating memory for ZST types which have no values.
317- . filter ( |ret_layout| !ret_layout. is_zst ( ) )
319+ // Don't bother allocating memory for ZST types which have no values
320+ // or for large values.
321+ . filter ( |ret_layout| !ret_layout. is_zst ( ) &&
322+ ret_layout. size < Size :: from_bytes ( MAX_ALLOC_LIMIT ) )
318323 . map ( |ret_layout| ecx. allocate ( ret_layout, MemoryKind :: Stack ) ) ;
319324
320325 ecx. push_stack_frame (
@@ -453,6 +458,11 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
453458 ) -> Option < ( ) > {
454459 let span = source_info. span ;
455460
461+ // #66397: Don't try to eval into large places as that can cause an OOM
462+ if place_layout. size >= Size :: from_bytes ( MAX_ALLOC_LIMIT ) {
463+ return None ;
464+ }
465+
456466 let overflow_check = self . tcx . sess . overflow_checks ( ) ;
457467
458468 // Perform any special handling for specific Rvalue types.
0 commit comments