]> git.lizzy.rs Git - rust.git/commitdiff
check return type even for uninhabited case
authorRalf Jung <post@ralfj.de>
Tue, 9 Oct 2018 16:16:27 +0000 (18:16 +0200)
committerRalf Jung <post@ralfj.de>
Sat, 13 Oct 2018 07:09:02 +0000 (09:09 +0200)
src/librustc_mir/interpret/terminator.rs

index 0ff18b0dd0b202553a6309c7c0dfdf37b4bbc1df..d8ec014b852f83777bb150b9936b8a538d90169a 100644 (file)
@@ -375,18 +375,19 @@ fn eval_fn_call(
                         return err!(FunctionArgCountMismatch);
                     }
                     // Don't forget to check the return type!
+                    let callee_ret = self.eval_place(&mir::Place::Local(mir::RETURN_PLACE))?;
                     if let Some(caller_ret) = dest {
-                        let callee_ret = self.eval_place(&mir::Place::Local(mir::RETURN_PLACE))?;
                         if !Self::check_argument_compat(caller_ret.layout, callee_ret.layout) {
                             return err!(FunctionRetMismatch(
                                 caller_ret.layout.ty, callee_ret.layout.ty
                             ));
                         }
                     } else {
-                        // FIXME: The caller thinks this function cannot return. How do
-                        // we verify that the callee agrees?
-                        // On the plus side, the the callee ever writes to its return place,
-                        // that will be detected as UB (because we set that to NULL above).
+                        if !callee_ret.layout.abi.is_uninhabited() {
+                            return err!(FunctionRetMismatch(
+                                self.tcx.types.never, callee_ret.layout.ty
+                            ));
+                        }
                     }
                     Ok(())
                 })();