Rollup merge of #22667 - dotdash:retslot_cast.rs, r=huonw
We already do this for the function arguments, but miss it for the retslot pointer, which can lead to LLVM assertions because the retslot has the wrong type. Fixes #22663
This commit is contained in:
commit
8f921502bd
@ -765,8 +765,16 @@ pub fn trans_call_inner<'a, 'blk, 'tcx, F>(bcx: Block<'blk, 'tcx>,
|
||||
if is_rust_fn {
|
||||
let mut llargs = Vec::new();
|
||||
|
||||
if let (ty::FnConverging(ret_ty), Some(llretslot)) = (ret_ty, opt_llretslot) {
|
||||
if let (ty::FnConverging(ret_ty), Some(mut llretslot)) = (ret_ty, opt_llretslot) {
|
||||
if type_of::return_uses_outptr(ccx, ret_ty) {
|
||||
let llformal_ret_ty = type_of::type_of(ccx, ret_ty).ptr_to();
|
||||
let llret_ty = common::val_ty(llretslot);
|
||||
if llformal_ret_ty != llret_ty {
|
||||
// this could happen due to e.g. subtyping
|
||||
debug!("casting actual return type ({}) to match formal ({})",
|
||||
bcx.llty_str(llret_ty), bcx.llty_str(llformal_ret_ty));
|
||||
llretslot = PointerCast(bcx, llretslot, llformal_ret_ty);
|
||||
}
|
||||
llargs.push(llretslot);
|
||||
}
|
||||
}
|
||||
|
25
src/test/compile-fail/retslot-cast.rs
Normal file
25
src/test/compile-fail/retslot-cast.rs
Normal file
@ -0,0 +1,25 @@
|
||||
// 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.
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(warnings)]
|
||||
|
||||
pub fn fail(x: Option<& (Iterator+Send)>) -> Option<&Iterator> {
|
||||
// This call used to trigger an LLVM assertion because the return slot had type
|
||||
// "Option<&Iterator>"* instead of "Option<&(Iterator+Send)>"*
|
||||
inner(x)
|
||||
}
|
||||
|
||||
pub fn inner(x: Option<& (Iterator+Send)>) -> Option<&(Iterator+Send)> {
|
||||
x
|
||||
}
|
||||
|
||||
#[rustc_error]
|
||||
fn main() {} //~ ERROR compilation successful
|
Loading…
x
Reference in New Issue
Block a user