Skip to content

Commit 920ca61

Browse files
committed
librustc: Pass the correct type when adding cleanups.
1 parent aa4455e commit 920ca61

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

Diff for: src/librustc/middle/trans/expr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1293,7 +1293,7 @@ fn trans_adt(bcx: @mut Block, repr: &adt::Repr, discr: ty::Disr,
12931293
adt::trans_start_init(bcx, repr, addr, discr);
12941294
for &(i, e) in fields.iter() {
12951295
let dest = adt::trans_field_ptr(bcx, repr, addr, discr, i);
1296-
let e_ty = expr_ty(bcx, e);
1296+
let e_ty = expr_ty_adjusted(bcx, e);
12971297
bcx = trans_into(bcx, e, SaveIn(dest));
12981298
add_clean_temp_mem(bcx, dest, e_ty);
12991299
temp_cleanups.push(dest);

Diff for: src/librustc/middle/trans/glue.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,7 @@ pub fn call_tydesc_glue_full(bcx: @mut Block,
274274
let ccx = bcx.ccx();
275275
// NB: Don't short-circuit even if this block is unreachable because
276276
// GC-based cleanup needs to the see that the roots are live.
277-
let no_lpads =
278-
ccx.sess.opts.debugging_opts & session::no_landing_pads != 0;
277+
let no_lpads = ccx.sess.opts.debugging_opts & session::no_landing_pads != 0;
279278
if bcx.unreachable && !no_lpads { return; }
280279

281280
let static_glue_fn = match static_ti {

Diff for: src/test/run-pass/issue-9382.rs

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#[allow(unnecessary_allocation)];
12+
13+
// Tests for a previous bug that occured due to an interaction
14+
// between struct field initialization and the auto-coercion
15+
// from a vector to a slice. The drop glue was being invoked on
16+
// the temporary slice with a wrong type, triggering an LLVM assert.
17+
18+
struct Thing1<'self> {
19+
baz: &'self [~int],
20+
bar: ~u64,
21+
}
22+
23+
struct Thing2<'self> {
24+
baz: &'self [~int],
25+
bar: u64,
26+
}
27+
28+
pub fn main() {
29+
let _t1_fixed = Thing1 {
30+
baz: [],
31+
bar: ~32,
32+
};
33+
let _t1_uniq = Thing1 {
34+
baz: ~[],
35+
bar: ~32,
36+
};
37+
let _t1_at = Thing1 {
38+
baz: @[],
39+
bar: ~32,
40+
};
41+
let _t2_fixed = Thing2 {
42+
baz: [],
43+
bar: 32,
44+
};
45+
let _t2_uniq = Thing2 {
46+
baz: ~[],
47+
bar: 32,
48+
};
49+
let _t2_at = Thing2 {
50+
baz: @[],
51+
bar: 32,
52+
};
53+
}

0 commit comments

Comments
 (0)