From 7ea7606874ea38acfa0bc332f1c3e135bb57859c Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Sat, 1 Nov 2014 14:59:22 -0700 Subject: [PATCH 1/2] Monomorphize method types in Typer impl for BlockS In some obscure circumstances, failure to do this can cause unsubstituted type parameters to show up where they aren't expected and cause an ICE. Closes #18514 --- src/librustc/middle/trans/common.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/librustc/middle/trans/common.rs b/src/librustc/middle/trans/common.rs index 60b107c049f41..8b5e82ecf9012 100644 --- a/src/librustc/middle/trans/common.rs +++ b/src/librustc/middle/trans/common.rs @@ -502,7 +502,11 @@ impl<'blk, 'tcx> mc::Typer<'tcx> for BlockS<'blk, 'tcx> { } fn node_method_ty(&self, method_call: typeck::MethodCall) -> Option { - self.tcx().method_map.borrow().find(&method_call).map(|method| method.ty) + self.tcx() + .method_map + .borrow() + .find(&method_call) + .map(|method| monomorphize_type(self, method.ty)) } fn adjustments<'a>(&'a self) -> &'a RefCell> { From 09cc2f1b13f270b7b63eca3090b006c4c87ee5e0 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Sat, 1 Nov 2014 15:20:57 -0700 Subject: [PATCH 2/2] Add regression test for issue #18514 --- src/test/auxiliary/issue-18514.rs | 27 +++++++++++++++++++++++++++ src/test/run-pass/issue-18514.rs | 24 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/test/auxiliary/issue-18514.rs create mode 100644 src/test/run-pass/issue-18514.rs diff --git a/src/test/auxiliary/issue-18514.rs b/src/test/auxiliary/issue-18514.rs new file mode 100644 index 0000000000000..2a5e07a32855e --- /dev/null +++ b/src/test/auxiliary/issue-18514.rs @@ -0,0 +1,27 @@ +// Copyright 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. + +#![crate_type = "rlib"] + +pub trait Tr { + fn tr(&self); +} + +pub struct St(pub Vec); + +impl Tr for St { + fn tr(&self) { + match self { + &St(ref v) => { + v.iter(); + } + } + } +} diff --git a/src/test/run-pass/issue-18514.rs b/src/test/run-pass/issue-18514.rs new file mode 100644 index 0000000000000..c75abd62deba6 --- /dev/null +++ b/src/test/run-pass/issue-18514.rs @@ -0,0 +1,24 @@ +// Copyright 2012 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. + +// Test that we don't ICE when translating a generic impl method from +// an extern crate that contains a match expression on a local +// variable lvalue where one of the match case bodies contains an +// expression that autoderefs through an overloaded generic deref +// impl. + +// aux-build:issue-18514.rs +extern crate "issue-18514" as ice; +use ice::{Tr, St}; + +fn main() { + let st: St<()> = St(vec![]); + st.tr(); +}