diff options
| -rw-r--r-- | src/librustc/middle/expr_use_visitor.rs | 30 | ||||
| -rw-r--r-- | src/test/run-pass/unboxed-closures-direct-sugary-call.rs | 17 |
2 files changed, 36 insertions, 11 deletions
diff --git a/src/librustc/middle/expr_use_visitor.rs b/src/librustc/middle/expr_use_visitor.rs index aefd57ab085..84b879227ae 100644 --- a/src/librustc/middle/expr_use_visitor.rs +++ b/src/librustc/middle/expr_use_visitor.rs @@ -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) diff --git a/src/test/run-pass/unboxed-closures-direct-sugary-call.rs b/src/test/run-pass/unboxed-closures-direct-sugary-call.rs new file mode 100644 index 00000000000..c77ee9914ef --- /dev/null +++ b/src/test/run-pass/unboxed-closures-direct-sugary-call.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 <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(); +} + |
