From 1660c3be932ff7beff5f025a708bf3ee0ff2ebd4 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Mon, 25 Aug 2014 13:30:49 -0700 Subject: [PATCH 1/2] librustc: Use Typer's node_ty method instead of free function in ExprUseVisitor. --- src/librustc/middle/expr_use_visitor.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/librustc/middle/expr_use_visitor.rs b/src/librustc/middle/expr_use_visitor.rs index 84b879227ae6c..0b71c35d2f887 100644 --- a/src/librustc/middle/expr_use_visitor.rs +++ b/src/librustc/middle/expr_use_visitor.rs @@ -234,7 +234,7 @@ impl<'d,'t,TYPER:mc::Typer> ExprUseVisitor<'d,'t,TYPER> { decl: &ast::FnDecl, body: &ast::Block) { for arg in decl.inputs.iter() { - let arg_ty = ty::node_id_to_type(self.tcx(), arg.pat.id); + let arg_ty = return_if_err!(self.typer.node_ty(arg.pat.id)); let arg_cmt = self.mc.cat_rvalue( arg.id, @@ -414,7 +414,7 @@ impl<'d,'t,TYPER:mc::Typer> ExprUseVisitor<'d,'t,TYPER> { // Fetch the type of the value that the iteration yields to // produce the pattern's categorized mutable type. - let pattern_type = ty::node_id_to_type(self.tcx(), pat.id); + let pattern_type = return_if_err!(self.typer.node_ty(pat.id)); let pat_cmt = self.mc.cat_rvalue(pat.id, pat.span, ty::ReScope(blk.id), @@ -828,7 +828,7 @@ impl<'d,'t,TYPER:mc::Typer> ExprUseVisitor<'d,'t,TYPER> { pat.repr(tcx)); // pat_ty: the type of the binding being produced. - let pat_ty = ty::node_id_to_type(tcx, pat.id); + let pat_ty = return_if_err!(typer.node_ty(pat.id)); // Each match binding is effectively an assignment to the // binding being produced. @@ -971,7 +971,7 @@ impl<'d,'t,TYPER:mc::Typer> ExprUseVisitor<'d,'t,TYPER> { // Create the cmt for the variable being borrowed, from the // caller's perspective let var_id = upvar_def.def_id().node; - let var_ty = ty::node_id_to_type(self.tcx(), var_id); + let var_ty = try!(self.typer.node_ty(var_id)); self.mc.cat_def(closure_id, closure_span, var_ty, upvar_def) } } From 2ab4486cbb450a6d1fb6a71bdeb6372c3bcef6c2 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Mon, 25 Aug 2014 13:37:40 -0700 Subject: [PATCH 2/2] Add test. --- src/test/auxiliary/issue-16643.rs | 27 +++++++++++++++++++++++++++ src/test/run-pass/issue-16643.rs | 17 +++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/test/auxiliary/issue-16643.rs create mode 100644 src/test/run-pass/issue-16643.rs diff --git a/src/test/auxiliary/issue-16643.rs b/src/test/auxiliary/issue-16643.rs new file mode 100644 index 0000000000000..b30ccb4dded0d --- /dev/null +++ b/src/test/auxiliary/issue-16643.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 = "lib"] + +pub struct TreeBuilder; + +impl TreeBuilder { + pub fn process_token(&mut self) { + match self { + _ => for _y in *self {} + } + } +} + +impl Iterator for TreeBuilder { + fn next(&mut self) -> Option { + None + } +} diff --git a/src/test/run-pass/issue-16643.rs b/src/test/run-pass/issue-16643.rs new file mode 100644 index 0000000000000..db877aaafcaf9 --- /dev/null +++ b/src/test/run-pass/issue-16643.rs @@ -0,0 +1,17 @@ +// 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. + +// aux-build:issue-16643.rs + +extern crate i = "issue-16643"; + +pub fn main() { + i::TreeBuilder::.process_token(); +}