Always evaluate the expression in [expr; n]

In case that there is a destination for the array, like in
"let x = [expr; n]", we currently don't evaluate the given expression if
n is zero. That's inconsistent with all other cases, including "[expr;
0]" without a destination.

Fixes #23354
This commit is contained in:
Björn Steinbrink 2015-03-14 14:19:29 +01:00
parent 766a4e1acc
commit 3a8f989dbb
2 changed files with 17 additions and 1 deletions

View File

@ -293,7 +293,7 @@ pub fn write_content<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
} }
SaveIn(lldest) => { SaveIn(lldest) => {
match ty::eval_repeat_count(bcx.tcx(), &**count_expr) { match ty::eval_repeat_count(bcx.tcx(), &**count_expr) {
0 => bcx, 0 => expr::trans_into(bcx, &**element, Ignore),
1 => expr::trans_into(bcx, &**element, SaveIn(lldest)), 1 => expr::trans_into(bcx, &**element, SaveIn(lldest)),
count => { count => {
let elem = unpack_datum!(bcx, expr::trans(bcx, &**element)); let elem = unpack_datum!(bcx, expr::trans(bcx, &**element));

View File

@ -0,0 +1,16 @@
// Copyright 2015 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.
// error-pattern:panic evaluated
#[allow(unused_variables)]
fn main() {
let x = [panic!("panic evaluated"); 0];
}