diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2013-03-12 15:06:57 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2013-03-13 20:07:09 -0700 |
| commit | b85158e23a12b1660591afe6ead1f375c2623b65 (patch) | |
| tree | f929990e4cdc4c76720fadc516b0d654bfda9221 | |
| parent | b1c699815ddf22bf17b58a8c3d317af33745e28d (diff) | |
librustc: Remove overloaded operator autoderef.
| -rw-r--r-- | src/librustc/middle/trans/foreign.rs | 2 | ||||
| -rw-r--r-- | src/librustc/middle/typeck/check/method.rs | 40 | ||||
| -rw-r--r-- | src/librustc/middle/typeck/check/mod.rs | 48 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 2 |
4 files changed, 63 insertions, 29 deletions
diff --git a/src/librustc/middle/trans/foreign.rs b/src/librustc/middle/trans/foreign.rs index f6b8e4af6d5..8dd55c9a37b 100644 --- a/src/librustc/middle/trans/foreign.rs +++ b/src/librustc/middle/trans/foreign.rs @@ -312,7 +312,7 @@ pub fn trans_foreign_mod(ccx: @CrateContext, let lname = link_name(ccx, foreign_item); let llbasefn = base_fn(ccx, *lname, tys, cc); // Name the shim function - let shim_name = lname + ~"__c_stack_shim"; + let shim_name = *lname + ~"__c_stack_shim"; return build_shim_fn_(ccx, shim_name, llbasefn, tys, cc, build_args, build_ret); } diff --git a/src/librustc/middle/typeck/check/method.rs b/src/librustc/middle/typeck/check/method.rs index 5d2469db285..d673cf6a39a 100644 --- a/src/librustc/middle/typeck/check/method.rs +++ b/src/librustc/middle/typeck/check/method.rs @@ -111,20 +111,26 @@ pub enum CheckTraitsFlag { CheckTraitsAndInherentMethods, } -pub fn lookup( - fcx: @mut FnCtxt, +#[deriving_eq] +pub enum AutoderefReceiverFlag { + AutoderefReceiver, + DontAutoderefReceiver, +} - // In a call `a.b::<X, Y, ...>(...)`: - expr: @ast::expr, // The expression `a.b`. - self_expr: @ast::expr, // The expression `a`. - callee_id: node_id, // Where to store the type of `a.b` - m_name: ast::ident, // The ident `b`. - self_ty: ty::t, // The type of `a`. - supplied_tps: &[ty::t], // The list of types X, Y, ... . - deref_args: check::DerefArgs, // Whether we autopointer first. - check_traits: CheckTraitsFlag) // Whether we check traits only. - -> Option<method_map_entry> -{ +pub fn lookup( + fcx: @mut FnCtxt, + + // In a call `a.b::<X, Y, ...>(...)`: + expr: @ast::expr, // The expression `a.b`. + self_expr: @ast::expr, // The expression `a`. + callee_id: node_id, // Where to store `a.b`'s type + m_name: ast::ident, // The ident `b`. + self_ty: ty::t, // The type of `a`. + supplied_tps: &[ty::t], // The list of types X, Y, ... . + deref_args: check::DerefArgs, // Whether we autopointer first. + check_traits: CheckTraitsFlag, // Whether we check traits only. + autoderef_receiver: AutoderefReceiverFlag) + -> Option<method_map_entry> { let lcx = LookupContext { fcx: fcx, expr: expr, @@ -137,6 +143,7 @@ pub fn lookup( extension_candidates: @mut ~[], deref_args: deref_args, check_traits: check_traits, + autoderef_receiver: autoderef_receiver, }; let mme = lcx.do_lookup(self_ty); debug!("method lookup for %s yielded %?", @@ -156,6 +163,7 @@ pub struct LookupContext { extension_candidates: @mut ~[Candidate], deref_args: check::DerefArgs, check_traits: CheckTraitsFlag, + autoderef_receiver: AutoderefReceiverFlag, } /** @@ -232,6 +240,12 @@ pub impl LookupContext/&self { } } + // Don't autoderef if we aren't supposed to. + if self.autoderef_receiver == DontAutoderefReceiver { + break; + } + + // Otherwise, perform autoderef. match self.deref(self_ty, &mut enum_dids) { None => { break; } Some(ty) => { diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index 39d769f30f5..240f79ce262 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -89,8 +89,11 @@ use middle::typeck::astconv::{AstConv, ast_path_to_ty}; use middle::typeck::astconv::{ast_region_to_region, ast_ty_to_ty}; use middle::typeck::astconv; use middle::typeck::check::_match::pat_ctxt; +use middle::typeck::check::method::{AutoderefReceiver}; +use middle::typeck::check::method::{AutoderefReceiverFlag}; use middle::typeck::check::method::{CheckTraitsAndInherentMethods}; -use middle::typeck::check::method::{CheckTraitsOnly, TransformTypeNormally}; +use middle::typeck::check::method::{CheckTraitsOnly, DontAutoderefReceiver}; +use middle::typeck::check::method::{TransformTypeNormally}; use middle::typeck::check::regionmanip::replace_bound_regions_in_fn_sig; use middle::typeck::check::vtable::{LocationInfo, VtableContext}; use middle::typeck::CrateCtxt; @@ -1373,7 +1376,8 @@ pub fn check_expr_with_unifier(fcx: @mut FnCtxt, expr_t, tps, DontDerefArgs, - CheckTraitsAndInherentMethods) { + CheckTraitsAndInherentMethods, + AutoderefReceiver) { Some(ref entry) => { let method_map = fcx.ccx.method_map; method_map.insert(expr.id, (*entry)); @@ -1453,7 +1457,8 @@ pub fn check_expr_with_unifier(fcx: @mut FnCtxt, self_t: ty::t, opname: ast::ident, +args: ~[@ast::expr], - +deref_args: DerefArgs) + +deref_args: DerefArgs, + +autoderef_receiver: AutoderefReceiverFlag) -> Option<(ty::t, bool)> { match method::lookup(fcx, op_ex, @@ -1463,7 +1468,8 @@ pub fn check_expr_with_unifier(fcx: @mut FnCtxt, self_t, ~[], deref_args, - CheckTraitsOnly) { + CheckTraitsOnly, + autoderef_receiver) { Some(ref origin) => { let method_ty = fcx.node_ty(op_ex.callee_id); let method_map = fcx.ccx.method_map; @@ -1548,9 +1554,14 @@ pub fn check_expr_with_unifier(fcx: @mut FnCtxt, let tcx = fcx.ccx.tcx; match ast_util::binop_to_method_name(op) { Some(ref name) => { - match lookup_op_method(fcx, ex, lhs_expr, lhs_resolved_t, + match lookup_op_method(fcx, + ex, + lhs_expr, + lhs_resolved_t, fcx.tcx().sess.ident_of(copy *name), - ~[rhs], DoDerefArgs) { + ~[rhs], + DoDerefArgs, + DontAutoderefReceiver) { Some(pair) => return pair, _ => () } @@ -1588,11 +1599,14 @@ pub fn check_expr_with_unifier(fcx: @mut FnCtxt, rhs_expr: @ast::expr, rhs_t: ty::t) -> ty::t { - match lookup_op_method( - fcx, ex, rhs_expr, rhs_t, - fcx.tcx().sess.ident_of(/*bad*/ copy mname), ~[], - DontDerefArgs) - { + match lookup_op_method(fcx, + ex, + rhs_expr, + rhs_t, + fcx.tcx().sess.ident_of(/*bad*/ copy mname), + ~[], + DontDerefArgs, + DontAutoderefReceiver) { Some((ret_ty, _)) => ret_ty, _ => { fcx.type_error_message(ex.span, |actual| { @@ -1740,7 +1754,8 @@ pub fn check_expr_with_unifier(fcx: @mut FnCtxt, expr_t, tps, DontDerefArgs, - CheckTraitsAndInherentMethods) { + CheckTraitsAndInherentMethods, + AutoderefReceiver) { Some(ref entry) => { let method_map = fcx.ccx.method_map; method_map.insert(expr.id, (*entry)); @@ -2569,9 +2584,14 @@ pub fn check_expr_with_unifier(fcx: @mut FnCtxt, None => { let resolved = structurally_resolved_type(fcx, expr.span, raw_base_t); - match lookup_op_method(fcx, expr, base, resolved, + match lookup_op_method(fcx, + expr, + base, + resolved, tcx.sess.ident_of(~"index"), - ~[idx], DontDerefArgs) { + ~[idx], + DontDerefArgs, + AutoderefReceiver) { Some((ret_ty, _)) => fcx.write_ty(id, ret_ty), _ => { fcx.type_error_message(expr.span, |actual| diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 170a1a3240e..0f06976249b 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3407,7 +3407,7 @@ pub impl Parser { let prefix = Path(self.sess.cm.span_to_filename(*self.span)); let prefix = prefix.dir_path(); let mod_path = Path(".").push_many(*self.mod_path_stack); - let default_path = self.sess.interner.get(id) + ~".rs"; + let default_path = *self.sess.interner.get(id) + ~".rs"; let file_path = match ::attr::first_attr_value_str_by_name( outer_attrs, ~"path") { Some(d) => { |
