]> git.lizzy.rs Git - rust.git/commitdiff
Mir typeck Cast for UnsafeFnPtr value
authorSantiago Pastorino <spastorino@gmail.com>
Thu, 30 Nov 2017 14:07:04 +0000 (11:07 -0300)
committerNiko Matsakis <niko@alum.mit.edu>
Wed, 13 Dec 2017 11:03:27 +0000 (06:03 -0500)
src/librustc_mir/transform/type_check.rs
src/test/compile-fail/mir_check_cast_unsafe_fn.rs [new file with mode: 0644]

index dcd97f2a7be44f2e4dbe494976b945639bcd1d42..0c481f964a793268366cc01570d119b60751b5ed 100644 (file)
@@ -1196,11 +1196,17 @@ fn check_rvalue(&mut self, mir: &Mir<'tcx>, rvalue: &Rvalue<'tcx>, location: Loc
                         }
                     }
 
+                    CastKind::UnsafeFnPointer => {
+                        let ty_fn_ptr_from = tcx.safe_to_unsafe_fn_ty(op.ty(mir, tcx).fn_sig(tcx));
+
+                        if let Err(terr) = self.eq_types(ty_fn_ptr_from, ty, location.at_self()) {
+                            span_mirbug!(self, "", "casting {:?}", terr);
+                        }
+                    }
+
                     CastKind::ClosureFnPointer |
-                    CastKind::UnsafeFnPointer |
                     CastKind::Misc |
                     CastKind::Unsize => {}
-
                 }
             }
 
diff --git a/src/test/compile-fail/mir_check_cast_unsafe_fn.rs b/src/test/compile-fail/mir_check_cast_unsafe_fn.rs
new file mode 100644 (file)
index 0000000..701a7c6
--- /dev/null
@@ -0,0 +1,24 @@
+// 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 <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.
+
+// compile-flags: -Z borrowck=mir -Z nll
+
+#![allow(dead_code)]
+
+fn bar<'a>(input: &'a u32, f: fn(&'a u32) -> &'a u32) -> &'static u32 {
+    // Here the NLL checker must relate the types in `f` to the types
+    // in `g`. These are related via the `UnsafeFnPointer` cast.
+    let g: unsafe fn(_) -> _ = f;
+    //~^ WARNING not reporting region error due to -Znll
+    unsafe { g(input) }
+    //~^ ERROR free region `'_#1r` does not outlive free region `'static`
+}
+
+fn main() {}