Auto merge of #33303 - Aatch:mir-coercion-cast, r=arielb1
[MIR] Handle coercion casts properly when building the MIR Coercion casts (`expr as T` where the type of `expr` can be coerced to `T`) are essentially no-ops, as the actual work is done by a coercion. Previously a check for type equality was used to avoid emitting the redundant cast in the MIR, but this failed for coercion casts of function items that had lifetime parameters. The MIR trans code doesn't handle `FnPtr -> FnPtr` casts and produced an error. Also fixes a bug with type ascription expressions not having any adjustments applied. Fixes #33295 /cc @eddyb
This commit is contained in:
commit
0eb575c702
4 changed files with 448 additions and 394 deletions
20
src/test/run-pass/mir_ascription_coercion.rs
Normal file
20
src/test/run-pass/mir_ascription_coercion.rs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
// 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.
|
||||
|
||||
// Tests that the result of type ascription has adjustments applied
|
||||
|
||||
#![feature(rustc_attrs, type_ascription)]
|
||||
|
||||
#[rustc_mir]
|
||||
fn main() {
|
||||
let x = [1, 2, 3];
|
||||
// The RHS should coerce to &[i32]
|
||||
let _y : &[i32] = &x : &[i32; 3];
|
||||
}
|
||||
22
src/test/run-pass/mir_coercion_casts.rs
Normal file
22
src/test/run-pass/mir_coercion_casts.rs
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
// 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.
|
||||
|
||||
// Tests the coercion casts are handled properly
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
#[rustc_mir]
|
||||
fn main() {
|
||||
// This should produce only a reification of f,
|
||||
// not a fn -> fn cast as well
|
||||
let _ = f as fn(&());
|
||||
}
|
||||
|
||||
fn f<'a>(_: &'a ()) { }
|
||||
Loading…
Add table
Add a link
Reference in a new issue