diff --git a/0006-alloc-Disable-some-unsupported-stuff.patch b/0006-alloc-Disable-some-unsupported-stuff.patch index ca336859109..1342bdd4e0c 100644 --- a/0006-alloc-Disable-some-unsupported-stuff.patch +++ b/0006-alloc-Disable-some-unsupported-stuff.patch @@ -5,7 +5,6 @@ Subject: [PATCH] [alloc] Disable some unsupported stuff --- src/liballoc/boxed.rs | 6 ------ - src/liballoc/str.rs | 4 ++++ src/liballoc/vec.rs | 2 -- 3 files changed, 4 insertions(+), 8 deletions(-) @@ -33,42 +32,6 @@ index f989e70..597dd15 100644 fn write_isize(&mut self, i: isize) { (**self).write_isize(i) } -diff --git a/src/liballoc/str.rs b/src/liballoc/str.rs -index 2af8956..23dbb79 100644 ---- a/src/liballoc/str.rs -+++ b/src/liballoc/str.rs -@@ -361,6 +361,7 @@ impl str { - #[stable(feature = "unicode_case_mapping", since = "1.2.0")] - pub fn to_lowercase(&self) -> String { - let mut s = String::with_capacity(self.len()); -+ /* - for (i, c) in self[..].char_indices() { - if c == 'Σ' { - // Σ maps to σ, except at the end of a word where it maps to ς. -@@ -384,6 +385,7 @@ impl str { - } - } - } -+ */ - return s; - - fn map_uppercase_sigma(from: &str, i: usize, to: &mut String) { -@@ -435,6 +437,7 @@ impl str { - #[stable(feature = "unicode_case_mapping", since = "1.2.0")] - pub fn to_uppercase(&self) -> String { - let mut s = String::with_capacity(self.len()); -+ /* - for c in self[..].chars() { - match conversions::to_upper(c) { - [a, '\0', _] => s.push(a), -@@ -449,6 +452,7 @@ impl str { - } - } - } -+ */ - return s; - } - diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index 2bc037e..2fe8894 100644 --- a/src/liballoc/vec.rs @@ -79,14 +42,13 @@ index 2bc037e..2fe8894 100644 impl_is_zero!(i64, |x| x == 0); -impl_is_zero!(i128, |x| x == 0); impl_is_zero!(isize, |x| x == 0); - + impl_is_zero!(u16, |x| x == 0); impl_is_zero!(u32, |x| x == 0); impl_is_zero!(u64, |x| x == 0); -impl_is_zero!(u128, |x| x == 0); impl_is_zero!(usize, |x| x == 0); - - impl_is_zero!(char, |x| x == '\0'); --- -2.17.1 (Apple Git-112) + impl_is_zero!(char, |x| x == '\0'); +-- +2.17.1 (Apple Git-112) diff --git a/src/base.rs b/src/base.rs index 3f0222ca6ae..402420644cd 100644 --- a/src/base.rs +++ b/src/base.rs @@ -588,18 +588,7 @@ fn trans_stmt<'a, 'tcx: 'a>( Rvalue::Len(place) => { let place = trans_place(fx, place); let usize_layout = fx.layout_of(fx.tcx.types.usize); - let len = match place.layout().ty.sty { - ty::Array(_elem_ty, len) => { - let len = crate::constant::force_eval_const(fx, len) - .unwrap_usize(fx.tcx) as i64; - fx.bcx.ins().iconst(fx.pointer_type, len) - } - ty::Slice(_elem_ty) => match place { - CPlace::Addr(_, size, _) => size.unwrap(), - CPlace::Var(_, _) => unreachable!(), - }, - _ => bug!("Rvalue::Len({:?})", place), - }; + let len = codegen_array_len(fx, place); lval.write_cvalue(fx, CValue::ByVal(len, usize_layout)); } Rvalue::NullaryOp(NullOp::Box, content_ty) => { @@ -660,6 +649,24 @@ fn trans_stmt<'a, 'tcx: 'a>( } } +fn codegen_array_len<'a, 'tcx: 'a>( + fx: &mut FunctionCx<'a, 'tcx, impl Backend>, + place: CPlace<'tcx>, +) -> Value { + match place.layout().ty.sty { + ty::Array(_elem_ty, len) => { + let len = crate::constant::force_eval_const(fx, len) + .unwrap_usize(fx.tcx) as i64; + fx.bcx.ins().iconst(fx.pointer_type, len) + } + ty::Slice(_elem_ty) => match place { + CPlace::Addr(_, size, _) => size.unwrap(), + CPlace::Var(_, _) => unreachable!(), + }, + _ => bug!("Rvalue::Len({:?})", place), + } +} + pub fn trans_get_discriminant<'a, 'tcx: 'a>( fx: &mut FunctionCx<'a, 'tcx, impl Backend>, value: CValue<'tcx>, @@ -1060,21 +1067,16 @@ pub fn trans_place<'a, 'tcx: 'a>( ProjectionElem::ConstantIndex { offset, min_length: _, - from_end: false, - } => unimpl!( - "projection const index {:?} offset {:?} not from end", - projection.base, - offset - ), - ProjectionElem::ConstantIndex { - offset, - min_length: _, - from_end: true, - } => unimpl!( - "projection const index {:?} offset {:?} from end", - projection.base, - offset - ), + from_end, + } => { + let index = if !from_end { + fx.bcx.ins().iconst(fx.pointer_type, offset as i64) + } else { + let len = codegen_array_len(fx, base); + fx.bcx.ins().iadd_imm(len, -(offset as i64)) + }; + base.place_index(fx, index) + }, ProjectionElem::Subslice { from, to } => unimpl!( "projection subslice {:?} from {} to {}", projection.base,