Skip to content

Commit

Permalink
Rollup merge of rust-lang#30774 - nagisa:mir-fix-constval-adts, r=ari…
Browse files Browse the repository at this point in the history
…elb1

Fixes rust-lang#30772

We used to have a untested special case which didn’t really work anyway, because of lacking casts. This PR removes the case in question.
  • Loading branch information
nagisa committed Jan 9, 2016
2 parents c826e13 + ea52d9e commit 1f2fc85
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 10 deletions.
15 changes: 5 additions & 10 deletions src/librustc_trans/trans/mir/constant.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,14 @@ use middle::ty::{Ty, TypeFoldable};
use rustc::middle::const_eval::ConstVal;
use rustc::mir::repr as mir;
use trans::common::{self, Block, C_bool, C_bytes, C_floating_f64, C_integral, C_str_slice};
use trans::consts::{self, TrueConst};
use trans::{type_of, expr};

use trans::consts;
use trans::expr;
use trans::type_of;

use super::operand::{OperandRef, OperandValue};
use super::MirContext;


impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
pub fn trans_constval(&mut self,
bcx: Block<'bcx, 'tcx>,
Expand Down Expand Up @@ -66,13 +67,7 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
ConstVal::Uint(v) => C_integral(llty, v, false),
ConstVal::Str(ref v) => C_str_slice(ccx, v.clone()),
ConstVal::ByteStr(ref v) => consts::addr_of(ccx, C_bytes(ccx, v), 1, "byte_str"),
ConstVal::Struct(id) | ConstVal::Tuple(id) => {
let expr = bcx.tcx().map.expect_expr(id);
match consts::const_expr(ccx, expr, param_substs, None, TrueConst::Yes) {
Ok((val, _)) => val,
Err(e) => panic!("const eval failure: {}", e.description()),
}
},
ConstVal::Struct(id) | ConstVal::Tuple(id) |
ConstVal::Array(id, _) | ConstVal::Repeat(id, _) => {
let expr = bcx.tcx().map.expect_expr(id);
expr::trans(bcx, expr).datum.val
Expand Down
32 changes: 32 additions & 0 deletions src/test/run-pass/mir_constval_adts.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(rustc_attrs)]

#[derive(PartialEq, Debug)]
struct Point {
_x: i32,
_y: i32,
}
const STRUCT: Point = Point { _x: 42, _y: 42 };
const TUPLE1: (i32, i32) = (42, 42);
const TUPLE2: (&'static str, &'static str) = ("hello","world");

#[rustc_mir]
fn mir() -> (Point, (i32, i32), (&'static str, &'static str)){
let struct1 = STRUCT;
let tuple1 = TUPLE1;
let tuple2 = TUPLE2;
(struct1, tuple1, tuple2)
}

fn main(){
assert_eq!(mir(), (STRUCT, TUPLE1, TUPLE2));
}

0 comments on commit 1f2fc85

Please sign in to comment.