From d3f51dcab85f6878fd25636bf1c8b8d4cf35b4ce Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Mon, 13 Oct 2014 14:50:10 +1300 Subject: [PATCH] Allow passing self as an argument to methods Part of UFCS (#16293) --- src/librustc/middle/resolve.rs | 16 ---------------- src/librustc/middle/trans/callee.rs | 4 ++-- src/librustc/middle/typeck/check/mod.rs | 6 ++---- 3 files changed, 4 insertions(+), 22 deletions(-) diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 66bea390b4e..4ec3fe0279e 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -5751,22 +5751,6 @@ impl<'a> Resolver<'a> { // Write the result into the def map. debug!("(resolving expr) resolved `{}`", self.path_idents_to_string(path)); - - // First-class methods are not supported yet; error - // out here. - match def { - (DefMethod(..), _) => { - self.resolve_error(expr.span, - "first-class methods \ - are not supported"); - self.session.span_note(expr.span, - "call the method \ - using the `.` \ - syntax"); - } - _ => {} - } - self.record_def(expr.id, def); } None => { diff --git a/src/librustc/middle/trans/callee.rs b/src/librustc/middle/trans/callee.rs index 1b23841c913..a0a67cc774f 100644 --- a/src/librustc/middle/trans/callee.rs +++ b/src/librustc/middle/trans/callee.rs @@ -165,7 +165,7 @@ fn trans<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, expr: &ast::Expr) let def_id = inline::maybe_instantiate_inline(bcx.ccx(), did); Callee { bcx: bcx, data: Intrinsic(def_id.node, substs) } } - def::DefFn(did, _, _) | + def::DefFn(did, _, _) | def::DefMethod(did, _) | def::DefStaticMethod(did, def::FromImpl(_), _) => { fn_callee(bcx, trans_fn_ref(bcx, did, ExprId(ref_expr.id))) } @@ -205,7 +205,7 @@ fn trans<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, expr: &ast::Expr) def::DefTy(..) | def::DefPrimTy(..) | def::DefAssociatedTy(..) | def::DefUse(..) | def::DefTyParamBinder(..) | def::DefRegion(..) | def::DefLabel(..) | def::DefTyParam(..) | - def::DefSelfTy(..) | def::DefMethod(..) => { + def::DefSelfTy(..) => { bcx.tcx().sess.span_bug( ref_expr.span, format!("cannot translate def {:?} \ diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index b78398fdb6d..fbc5fb8936a 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -5029,7 +5029,8 @@ pub fn polytype_for_def(fcx: &FnCtxt, } def::DefFn(id, _, _) | def::DefStaticMethod(id, _, _) | def::DefStatic(id, _) | def::DefVariant(_, id, _) | - def::DefStruct(id) | def::DefConst(id) => { + def::DefStruct(id) | def::DefConst(id) | + def::DefMethod(id, _) => { return ty::lookup_item_type(fcx.ccx.tcx, id); } def::DefTrait(_) | @@ -5057,9 +5058,6 @@ pub fn polytype_for_def(fcx: &FnCtxt, def::DefSelfTy(..) => { fcx.ccx.tcx.sess.span_bug(sp, "expected value, found self ty"); } - def::DefMethod(..) => { - fcx.ccx.tcx.sess.span_bug(sp, "expected value, found method"); - } } }