Skip to content

Commit 6931641

Browse files
committed
---
yaml --- r: 282023 b: refs/heads/stable c: b38627d h: refs/heads/master i: 282021: c8d89c4 282019: d26bebd 282015: 255d87d
1 parent 4cedcbd commit 6931641

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ refs/heads/tmp: e06d2ad9fcd5027bcaac5b08fc9aa39a49d0ecd3
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f
3030
refs/tags/homu-tmp: 3c795e08d6f4a532f12f3f8e1837db5e0647f8b0
3131
refs/tags/1.0.0-beta: 8cbb92b53468ee2b0c2d3eeb8567005953d40828
32-
refs/heads/stable: 56417b373253932a19e811d001f63ef99f9d4d13
32+
refs/heads/stable: b38627dafb534fc6773d3f4061d639a2c7b86f9f
3333
refs/tags/1.0.0: 55bd4f8ff2b323f317ae89e254ce87162d52a375
3434
refs/tags/1.1.0: bc3c16f09287e5545c1d3f76b7abd54f2eca868b
3535
refs/tags/1.2.0: f557861f822c34f07270347b94b5280de20a597e

branches/stable/src/librustc_trans/trans/mir/lvalue.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,18 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
115115
let tr_base = self.trans_lvalue(bcx, &projection.base);
116116
let projected_ty = tr_base.ty.projection_ty(tcx, &projection.elem);
117117
let projected_ty = bcx.monomorphize(&projected_ty);
118+
119+
let project_index = |llindex| {
120+
let element = if let ty::TySlice(_) = tr_base.ty.to_ty(tcx).sty {
121+
// Slices already point to the array element type.
122+
bcx.inbounds_gep(tr_base.llval, &[llindex])
123+
} else {
124+
let zero = common::C_uint(bcx.ccx(), 0u64);
125+
bcx.inbounds_gep(tr_base.llval, &[zero, llindex])
126+
};
127+
(element, ptr::null_mut())
128+
};
129+
118130
let (llprojected, llextra) = match projection.elem {
119131
mir::ProjectionElem::Deref => {
120132
let base_ty = tr_base.ty.to_ty(tcx);
@@ -153,30 +165,21 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
153165
}
154166
mir::ProjectionElem::Index(ref index) => {
155167
let index = self.trans_operand(bcx, index);
156-
let llindex = self.prepare_index(bcx, index.immediate());
157-
let zero = common::C_uint(bcx.ccx(), 0u64);
158-
(bcx.inbounds_gep(tr_base.llval, &[zero, llindex]),
159-
ptr::null_mut())
168+
project_index(self.prepare_index(bcx, index.immediate()))
160169
}
161170
mir::ProjectionElem::ConstantIndex { offset,
162171
from_end: false,
163172
min_length: _ } => {
164173
let lloffset = common::C_u32(bcx.ccx(), offset);
165-
let llindex = self.prepare_index(bcx, lloffset);
166-
let zero = common::C_uint(bcx.ccx(), 0u64);
167-
(bcx.inbounds_gep(tr_base.llval, &[zero, llindex]),
168-
ptr::null_mut())
174+
project_index(self.prepare_index(bcx, lloffset))
169175
}
170176
mir::ProjectionElem::ConstantIndex { offset,
171177
from_end: true,
172178
min_length: _ } => {
173179
let lloffset = common::C_u32(bcx.ccx(), offset);
174180
let lllen = self.lvalue_len(bcx, tr_base);
175181
let llindex = bcx.sub(lllen, lloffset);
176-
let llindex = self.prepare_index(bcx, llindex);
177-
let zero = common::C_uint(bcx.ccx(), 0u64);
178-
(bcx.inbounds_gep(tr_base.llval, &[zero, llindex]),
179-
ptr::null_mut())
182+
project_index(self.prepare_index(bcx, llindex))
180183
}
181184
mir::ProjectionElem::Downcast(..) => {
182185
(tr_base.llval, tr_base.llextra)

0 commit comments

Comments
 (0)