auto merge of #16632 : pcwalton/rust/unboxed-closures-euv, r=luqmana

expression use visitor.

Closes #16166.

r? @huonw
This commit is contained in:
bors 2014-08-21 14:40:57 +00:00
commit 4444aec142
2 changed files with 36 additions and 11 deletions

View File

@ -130,16 +130,11 @@ impl OverloadedCallType {
fn from_method_id(tcx: &ty::ctxt, method_id: ast::DefId)
-> OverloadedCallType {
let method_descriptor =
match tcx.impl_or_trait_items.borrow_mut().find(&method_id) {
Some(&ty::MethodTraitItem(ref method_descriptor)) => {
(*method_descriptor).clone()
}
None => {
tcx.sess.bug("overloaded call method wasn't in method \
map")
}
};
let method_descriptor = match ty::impl_or_trait_item(tcx, method_id) {
ty::MethodTraitItem(ref method_descriptor) => {
(*method_descriptor).clone()
}
};
let impl_id = match method_descriptor.container {
ty::TraitContainer(_) => {
tcx.sess.bug("statically resolved overloaded call method \
@ -157,6 +152,19 @@ impl OverloadedCallType {
OverloadedCallType::from_trait_id(tcx, trait_ref.def_id)
}
fn from_unboxed_closure(tcx: &ty::ctxt, closure_did: ast::DefId)
-> OverloadedCallType {
let trait_did =
tcx.unboxed_closures
.borrow()
.find(&closure_did)
.expect("OverloadedCallType::from_unboxed_closure: didn't \
find closure id")
.kind
.trait_did(tcx);
OverloadedCallType::from_trait_id(tcx, trait_did)
}
fn from_method_origin(tcx: &ty::ctxt, origin: &MethodOrigin)
-> OverloadedCallType {
match *origin {
@ -164,7 +172,7 @@ impl OverloadedCallType {
OverloadedCallType::from_method_id(tcx, def_id)
}
MethodStaticUnboxedClosure(def_id) => {
OverloadedCallType::from_method_id(tcx, def_id)
OverloadedCallType::from_unboxed_closure(tcx, def_id)
}
MethodParam(ref method_param) => {
OverloadedCallType::from_trait_id(tcx, method_param.trait_id)

View File

@ -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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(unboxed_closures, overloaded_calls)]
fn main() {
let mut unboxed = |&mut:| {};
unboxed();
}