diff options
| author | Ralf Jung <post@ralfj.de> | 2019-12-12 15:23:27 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2019-12-12 15:23:27 +0100 |
| commit | b2392aa2fcf0b4638b5db42fab12b1a4d2d98e28 (patch) | |
| tree | 624cc81786a715cfb11456f753e9caa6ed87ac45 | |
| parent | f284f8b4be3a899bf2ecc03e2a1589f486b62a9f (diff) | |
| download | rust-b2392aa2fcf0b4638b5db42fab12b1a4d2d98e28.tar.gz rust-b2392aa2fcf0b4638b5db42fab12b1a4d2d98e28.zip | |
dont ICE in case of invalid drop fn
| -rw-r--r-- | src/librustc_mir/interpret/traits.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/librustc_mir/interpret/traits.rs b/src/librustc_mir/interpret/traits.rs index efa0d266cbc..916ea3dc393 100644 --- a/src/librustc_mir/interpret/traits.rs +++ b/src/librustc_mir/interpret/traits.rs @@ -140,7 +140,18 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let fn_sig = drop_instance.ty(*self.tcx).fn_sig(*self.tcx); let fn_sig = self.tcx.normalize_erasing_late_bound_regions(self.param_env, &fn_sig); // The drop function takes `*mut T` where `T` is the type being dropped, so get that. - let ty = fn_sig.inputs()[0].builtin_deref(true).unwrap().ty; + let args = fn_sig.inputs(); + if args.len() != 1 { + throw_ub_format!( + "drop fn should have 1 argument, but signature is {:?}", fn_sig + ); + } + let ty = args[0].builtin_deref(true) + .ok_or_else(|| err_ub_format!( + "drop fn argument type {} is not a pointer type", + args[0] + ))? + .ty; Ok((drop_instance, ty)) } |
