Skip to content

Commit 19135c0

Browse files
committed
---
yaml --- r: 273263 b: refs/heads/beta c: b38627d h: refs/heads/master i: 273261: fa2933e 273259: 7205910 273255: a81fa9e 273247: 216fd9f
1 parent 619db9d commit 19135c0

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
@@ -23,7 +23,7 @@ refs/tags/0.9: 36870b185fc5f5486636d4515f0e22677493f225
2323
refs/tags/0.10: ac33f2b15782272ae348dbd7b14b8257b2148b5a
2424
refs/tags/0.11.0: e1247cb1d0d681be034adb4b558b5a0c0d5720f9
2525
refs/tags/0.12.0: f0c419429ef30723ceaf6b42f9b5a2aeb5d2e2d1
26-
refs/heads/beta: 56417b373253932a19e811d001f63ef99f9d4d13
26+
refs/heads/beta: b38627dafb534fc6773d3f4061d639a2c7b86f9f
2727
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
2828
refs/heads/tmp: e06d2ad9fcd5027bcaac5b08fc9aa39a49d0ecd3
2929
refs/tags/1.0.0-alpha.2: 4c705f6bc559886632d3871b04f58aab093bfa2f

branches/beta/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)