Skip to content

Commit c3a6d28

Browse files
author
Jorge Aparicio
committed
Tell typeck which binops are by value
1 parent 14c0a70 commit c3a6d28

File tree

1 file changed

+25
-23
lines changed
  • src/librustc_typeck/check

1 file changed

+25
-23
lines changed

src/librustc_typeck/check/mod.rs

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2904,6 +2904,7 @@ pub fn lookup_tup_field_ty<'tcx>(tcx: &ty::ctxt<'tcx>,
29042904

29052905
// Controls whether the arguments are automatically referenced. This is useful
29062906
// for overloaded binary and unary operators.
2907+
#[deriving(PartialEq)]
29072908
pub enum DerefArgs {
29082909
DontDerefArgs,
29092910
DoDerefArgs
@@ -3130,7 +3131,8 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
31303131
trait_did: Option<ast::DefId>,
31313132
lhs: &'a ast::Expr,
31323133
rhs: Option<&P<ast::Expr>>,
3133-
unbound_method: F) -> Ty<'tcx> where
3134+
unbound_method: F,
3135+
deref_args: DerefArgs) -> Ty<'tcx> where
31343136
F: FnOnce(),
31353137
{
31363138
let method = match trait_did {
@@ -3146,7 +3148,7 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
31463148
// traits that don't force left and right to have same
31473149
// type.
31483150
let (adj_ty, adjustment) = match lhs_ty.sty {
3149-
ty::ty_rptr(r_in, mt) => {
3151+
ty::ty_rptr(r_in, mt) if deref_args == DoDerefArgs => {
31503152
let r_adj = fcx.infcx().next_region_var(infer::Autoref(lhs.span));
31513153
fcx.mk_subr(infer::Reborrow(lhs.span), r_adj, r_in);
31523154
let adjusted_ty = ty::mk_rptr(fcx.tcx(), r_adj, mt);
@@ -3183,7 +3185,7 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
31833185
method_ty,
31843186
op_ex,
31853187
args.as_slice(),
3186-
DoDerefArgs,
3188+
deref_args,
31873189
DontTupleArguments) {
31883190
ty::FnConverging(result_type) => result_type,
31893191
ty::FnDiverging => ty::mk_err()
@@ -3199,7 +3201,7 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
31993201
expected_ty,
32003202
op_ex,
32013203
args.as_slice(),
3202-
DoDerefArgs,
3204+
deref_args,
32033205
DontTupleArguments);
32043206
ty::mk_err()
32053207
}
@@ -3318,23 +3320,23 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
33183320
rhs: &P<ast::Expr>) -> Ty<'tcx> {
33193321
let tcx = fcx.ccx.tcx;
33203322
let lang = &tcx.lang_items;
3321-
let (name, trait_did) = match op {
3322-
ast::BiAdd => ("add", lang.add_trait()),
3323-
ast::BiSub => ("sub", lang.sub_trait()),
3324-
ast::BiMul => ("mul", lang.mul_trait()),
3325-
ast::BiDiv => ("div", lang.div_trait()),
3326-
ast::BiRem => ("rem", lang.rem_trait()),
3327-
ast::BiBitXor => ("bitxor", lang.bitxor_trait()),
3328-
ast::BiBitAnd => ("bitand", lang.bitand_trait()),
3329-
ast::BiBitOr => ("bitor", lang.bitor_trait()),
3330-
ast::BiShl => ("shl", lang.shl_trait()),
3331-
ast::BiShr => ("shr", lang.shr_trait()),
3332-
ast::BiLt => ("lt", lang.ord_trait()),
3333-
ast::BiLe => ("le", lang.ord_trait()),
3334-
ast::BiGe => ("ge", lang.ord_trait()),
3335-
ast::BiGt => ("gt", lang.ord_trait()),
3336-
ast::BiEq => ("eq", lang.eq_trait()),
3337-
ast::BiNe => ("ne", lang.eq_trait()),
3323+
let (name, trait_did, deref_args) = match op {
3324+
ast::BiAdd => ("add", lang.add_trait(), DontDerefArgs),
3325+
ast::BiSub => ("sub", lang.sub_trait(), DontDerefArgs),
3326+
ast::BiMul => ("mul", lang.mul_trait(), DontDerefArgs),
3327+
ast::BiDiv => ("div", lang.div_trait(), DontDerefArgs),
3328+
ast::BiRem => ("rem", lang.rem_trait(), DontDerefArgs),
3329+
ast::BiBitXor => ("bitxor", lang.bitxor_trait(), DontDerefArgs),
3330+
ast::BiBitAnd => ("bitand", lang.bitand_trait(), DontDerefArgs),
3331+
ast::BiBitOr => ("bitor", lang.bitor_trait(), DontDerefArgs),
3332+
ast::BiShl => ("shl", lang.shl_trait(), DontDerefArgs),
3333+
ast::BiShr => ("shr", lang.shr_trait(), DontDerefArgs),
3334+
ast::BiLt => ("lt", lang.ord_trait(), DoDerefArgs),
3335+
ast::BiLe => ("le", lang.ord_trait(), DoDerefArgs),
3336+
ast::BiGe => ("ge", lang.ord_trait(), DoDerefArgs),
3337+
ast::BiGt => ("gt", lang.ord_trait(), DoDerefArgs),
3338+
ast::BiEq => ("eq", lang.eq_trait(), DoDerefArgs),
3339+
ast::BiNe => ("ne", lang.eq_trait(), DoDerefArgs),
33383340
ast::BiAnd | ast::BiOr => {
33393341
check_expr(fcx, &**rhs);
33403342
return ty::mk_err();
@@ -3347,7 +3349,7 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
33473349
ast_util::binop_to_string(op),
33483350
actual)
33493351
}, lhs_resolved_t, None)
3350-
})
3352+
}, deref_args)
33513353
}
33523354

33533355
fn check_user_unop<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
@@ -3363,7 +3365,7 @@ fn check_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>,
33633365
format!("cannot apply unary operator `{}` to type `{}`",
33643366
op_str, actual)
33653367
}, rhs_t, None);
3366-
})
3368+
}, DontDerefArgs)
33673369
}
33683370

33693371
// Check field access expressions

0 commit comments

Comments
 (0)