]> git.lizzy.rs Git - rust.git/commitdiff
move our check to reuse a previous computation
authorJorge Aparicio <jorge@japaric.io>
Thu, 23 Aug 2018 14:39:03 +0000 (16:39 +0200)
committerRalf Jung <post@ralfj.de>
Sun, 30 Sep 2018 15:27:06 +0000 (17:27 +0200)
src/librustc_codegen_llvm/mir/block.rs

index c8515a4b6fffa7d2a885f74e7c6f51ce855fff1b..8a0ec731f45a64477a544104892db1a47eca03d7 100644 (file)
@@ -463,8 +463,28 @@ fn codegen_terminator(&mut self,
                     return;
                 }
 
+                let extra_args = &args[sig.inputs().len()..];
+                let extra_args = extra_args.iter().map(|op_arg| {
+                    let op_ty = op_arg.ty(self.mir, bx.tcx());
+                    self.monomorphize(&op_ty)
+                }).collect::<Vec<_>>();
+
+                let fn_ty = match def {
+                    Some(ty::InstanceDef::Virtual(..)) => {
+                        FnType::new_vtable(bx.cx, sig, &extra_args)
+                    }
+                    Some(ty::InstanceDef::DropGlue(_, None)) => {
+                        // empty drop glue - a nop.
+                        let &(_, target) = destination.as_ref().unwrap();
+                        funclet_br(self, bx, target);
+                        return;
+                    }
+                    _ => FnType::new(bx.cx, sig, &extra_args)
+                };
+
+                // emit a panic instead of instantiating an uninhabited type
                 if (intrinsic == Some("init") || intrinsic == Some("uninit")) &&
-                    bx.cx.layout_of(sig.output()).abi.is_uninhabited()
+                    fn_ty.ret.layout.abi.is_uninhabited()
                 {
                     let loc = bx.sess().codemap().lookup_char_pos(span.lo());
                     let filename = Symbol::intern(&loc.file.name.to_string()).as_str();
@@ -510,25 +530,6 @@ fn codegen_terminator(&mut self,
                     return;
                 }
 
-                let extra_args = &args[sig.inputs().len()..];
-                let extra_args = extra_args.iter().map(|op_arg| {
-                    let op_ty = op_arg.ty(self.mir, bx.tcx());
-                    self.monomorphize(&op_ty)
-                }).collect::<Vec<_>>();
-
-                let fn_ty = match def {
-                    Some(ty::InstanceDef::Virtual(..)) => {
-                        FnType::new_vtable(bx.cx, sig, &extra_args)
-                    }
-                    Some(ty::InstanceDef::DropGlue(_, None)) => {
-                        // empty drop glue - a nop.
-                        let &(_, target) = destination.as_ref().unwrap();
-                        funclet_br(self, bx, target);
-                        return;
-                    }
-                    _ => FnType::new(bx.cx, sig, &extra_args)
-                };
-
                 // The arguments we'll be passing. Plus one to account for outptr, if used.
                 let arg_count = fn_ty.args.len() + fn_ty.ret.is_indirect() as usize;
                 let mut llargs = Vec::with_capacity(arg_count);