From fbc2e92caa63674520edc53c7cb8f49df77b81a8 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Sat, 8 Nov 2014 11:01:06 -0800 Subject: [PATCH 1/3] Fix handling of for loop patterns in regionck When establishing region links within a pattern, use the mem-cat of the type the pattern matches against (that is, the result of `iter.next()`) rather than that of the iterator type. Closes #17068 Closes #18767 --- src/librustc/middle/typeck/check/regionck.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/librustc/middle/typeck/check/regionck.rs b/src/librustc/middle/typeck/check/regionck.rs index 014180a11553a..d47d5649c6564 100644 --- a/src/librustc/middle/typeck/check/regionck.rs +++ b/src/librustc/middle/typeck/check/regionck.rs @@ -770,8 +770,12 @@ fn visit_expr(rcx: &mut Rcx, expr: &ast::Expr) { { let mc = mc::MemCategorizationContext::new(rcx); - let head_cmt = ignore_err!(mc.cat_expr(&**head)); - link_pattern(rcx, mc, head_cmt, &**pat); + let pat_ty = rcx.resolve_node_type(pat.id); + let pat_cmt = mc.cat_rvalue(pat.id, + pat.span, + ty::ReScope(body.id), + pat_ty); + link_pattern(rcx, mc, pat_cmt, &**pat); } rcx.visit_expr(&**head); From 472e0cf8f3cffb545b2e95a69c336d8e02c8843f Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Sat, 8 Nov 2014 11:04:37 -0800 Subject: [PATCH 2/3] Add regression for #17068 --- src/test/run-pass/issue-17068.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/run-pass/issue-17068.rs diff --git a/src/test/run-pass/issue-17068.rs b/src/test/run-pass/issue-17068.rs new file mode 100644 index 0000000000000..dfbe740622933 --- /dev/null +++ b/src/test/run-pass/issue-17068.rs @@ -0,0 +1,20 @@ +// 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. + +// Test that regionck creates the right region links in the pattern +// binding of a for loop +fn foo<'a>(v: &'a [uint]) -> &'a uint { + for &ref x in v.iter() { return x; } + unreachable!() +} + +fn main() { + assert_eq!(foo(&[0]), &0); +} From a553c2d3bca9aeeb29fed7e6187fbf1bec1b8895 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Sat, 8 Nov 2014 11:04:50 -0800 Subject: [PATCH 3/3] Add regression for #18767 --- src/test/run-pass/issue-18767.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/test/run-pass/issue-18767.rs diff --git a/src/test/run-pass/issue-18767.rs b/src/test/run-pass/issue-18767.rs new file mode 100644 index 0000000000000..6ba5906708ca0 --- /dev/null +++ b/src/test/run-pass/issue-18767.rs @@ -0,0 +1,18 @@ +// 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. + +// Test that regionck uses the right memcat for patterns in for loops +// and doesn't ICE. + +fn main() { + for &&x in Some(&0u).iter() { + assert_eq!(x, 0) + } +}