about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2017-12-01 21:11:25 -0500
committerNiko Matsakis <niko@alum.mit.edu>2017-12-13 06:03:28 -0500
commitdecbbb3fc03875e7b188d8ed30ded23a87d81696 (patch)
treebaac2a2e9ae195dac84d819b183de832412d741b
parentd5cff0740fa761aea4aa22d0e3b1637730dda460 (diff)
downloadrust-decbbb3fc03875e7b188d8ed30ded23a87d81696.tar.gz
rust-decbbb3fc03875e7b188d8ed30ded23a87d81696.zip
when reifying a safe fn as an unsafe fn ptr, insert two casts
Otherwise, `run-pass/typeck-fn-to-unsafe-fn-ptr.rs` fails the MIR type checker.
-rw-r--r--src/librustc_typeck/check/coercion.rs15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/librustc_typeck/check/coercion.rs b/src/librustc_typeck/check/coercion.rs
index 079dc2964a3..edda557c98c 100644
--- a/src/librustc_typeck/check/coercion.rs
+++ b/src/librustc_typeck/check/coercion.rs
@@ -638,9 +638,18 @@ impl<'f, 'gcx, 'tcx> Coerce<'f, 'gcx, 'tcx> {
                     self.normalize_associated_types_in_as_infer_ok(self.cause.span, &a_sig);
 
                 let a_fn_pointer = self.tcx.mk_fn_ptr(a_sig);
-                let InferOk { value, obligations: o2 } =
-                    self.coerce_from_safe_fn(a_fn_pointer, a_sig, b,
-                        simple(Adjust::ReifyFnPointer), simple(Adjust::ReifyFnPointer))?;
+                let InferOk { value, obligations: o2 } = self.coerce_from_safe_fn(
+                    a_fn_pointer,
+                    a_sig,
+                    b,
+                    |unsafe_ty| {
+                        vec![
+                            Adjustment { kind: Adjust::ReifyFnPointer, target: a_fn_pointer },
+                            Adjustment { kind: Adjust::UnsafeFnPointer, target: unsafe_ty },
+                        ]
+                    },
+                    simple(Adjust::ReifyFnPointer)
+                )?;
 
                 obligations.extend(o2);
                 Ok(InferOk { value, obligations })