From 408e10a00bb656d701b619f64b6eadbaf46ec039 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Wed, 30 Jul 2014 17:47:54 -0700 Subject: [PATCH] librustc: Don't ICE when trying to subst regions in destructor call. --- src/librustc/middle/subst.rs | 6 +++-- src/librustc/middle/trans/base.rs | 3 +++ src/test/run-pass/issue-15858.rs | 45 +++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/test/run-pass/issue-15858.rs diff --git a/src/librustc/middle/subst.rs b/src/librustc/middle/subst.rs index ef0709316f0a..673872103af6 100644 --- a/src/librustc/middle/subst.rs +++ b/src/librustc/middle/subst.rs @@ -584,9 +584,11 @@ impl<'a> TypeFolder for SubstFolder<'a> { self.tcx().sess.span_bug( span, format!("Type parameter out of range \ - when substituting in region {} (root type={})", + when substituting in region {} (root type={}) \ + (space={}, index={})", region_name.as_str(), - self.root_ty.repr(self.tcx())).as_slice()); + self.root_ty.repr(self.tcx()), + space, i).as_slice()); } } } diff --git a/src/librustc/middle/trans/base.rs b/src/librustc/middle/trans/base.rs index 5433923441a7..fe7b0616974a 100644 --- a/src/librustc/middle/trans/base.rs +++ b/src/librustc/middle/trans/base.rs @@ -485,6 +485,9 @@ pub fn get_res_dtor(ccx: &CrateContext, if !substs.types.is_empty() { assert_eq!(did.krate, ast::LOCAL_CRATE); + // Since we're in trans we don't care for any region parameters + let ref substs = subst::Substs::erased(substs.types.clone()); + let vtables = typeck::check::vtable::trans_resolve_method(ccx.tcx(), did.node, substs); let (val, _) = monomorphize::monomorphic_fn(ccx, did, substs, vtables, None); diff --git a/src/test/run-pass/issue-15858.rs b/src/test/run-pass/issue-15858.rs new file mode 100644 index 000000000000..c75c67254612 --- /dev/null +++ b/src/test/run-pass/issue-15858.rs @@ -0,0 +1,45 @@ +// Copyright 2012-2014 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(unsafe_destructor)] + +static mut DROP_RAN: bool = false; + +trait Bar<'b> { + fn do_something(&mut self); +} + +struct BarImpl<'b>; + +impl<'b> Bar<'b> for BarImpl<'b> { + fn do_something(&mut self) {} +} + + +struct Foo; + +#[unsafe_destructor] +impl<'b, B: Bar<'b>> Drop for Foo { + fn drop(&mut self) { + unsafe { + DROP_RAN = true; + } + } +} + + +fn main() { + { + let _x: Foo = Foo; + } + unsafe { + assert_eq!(DROP_RAN, true); + } +}