From 14700e58b430ddddef037715778e452db8763ae9 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 30 Nov 2017 12:43:32 -0300 Subject: [PATCH] Mir typeck Cast for ClosureFnPtr value --- src/librustc_mir/transform/type_check.rs | 18 ++++++++++++--- .../compile-fail/mir_check_cast_closure.rs | 22 +++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 src/test/compile-fail/mir_check_cast_closure.rs diff --git a/src/librustc_mir/transform/type_check.rs b/src/librustc_mir/transform/type_check.rs index 0c481f964a7..00e60bd1910 100644 --- a/src/librustc_mir/transform/type_check.rs +++ b/src/librustc_mir/transform/type_check.rs @@ -1196,6 +1196,20 @@ impl<'a, 'gcx, 'tcx> TypeChecker<'a, 'gcx, 'tcx> { } } + CastKind::ClosureFnPointer => { + let sig = match op.ty(mir, tcx).sty { + ty::TyClosure(def_id, substs) => { + substs.closure_sig_ty(def_id, tcx).fn_sig(tcx) + } + _ => bug!(), + }; + let ty_fn_ptr_from = tcx.coerce_closure_fn_ty(sig); + + if let Err(terr) = self.eq_types(ty_fn_ptr_from, ty, location.at_self()) { + span_mirbug!(self, "", "casting {:?}", terr); + } + } + CastKind::UnsafeFnPointer => { let ty_fn_ptr_from = tcx.safe_to_unsafe_fn_ty(op.ty(mir, tcx).fn_sig(tcx)); @@ -1204,9 +1218,7 @@ impl<'a, 'gcx, 'tcx> TypeChecker<'a, 'gcx, 'tcx> { } } - CastKind::ClosureFnPointer | - CastKind::Misc | - CastKind::Unsize => {} + CastKind::Misc | CastKind::Unsize => {} } } diff --git a/src/test/compile-fail/mir_check_cast_closure.rs b/src/test/compile-fail/mir_check_cast_closure.rs new file mode 100644 index 00000000000..be0d4b13741 --- /dev/null +++ b/src/test/compile-fail/mir_check_cast_closure.rs @@ -0,0 +1,22 @@ +// Copyright 2017 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// compile-flags: -Z borrowck=mir -Z nll + +#![allow(dead_code)] + +fn bar<'a, 'b>() -> fn(&'a u32, &'b u32) -> &'a u32 { + let g: fn(_, _) -> _ = |_x, y| y; + g + //~^ WARNING not reporting region error due to -Znll + //~| ERROR free region `'b` does not outlive free region `'a` +} + +fn main() {}