@@ -36,21 +36,23 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
3636 let ( lhs_ty, rhs_ty, return_ty) =
3737 self . check_overloaded_binop ( expr, lhs, rhs, op, IsAssign :: Yes , expected) ;
3838
39- let ty =
40- if !lhs_ty. is_ty_var ( ) && !rhs_ty. is_ty_var ( ) && is_builtin_binop ( lhs_ty, rhs_ty, op) {
41- self . enforce_builtin_binop_types ( lhs. span , lhs_ty, rhs. span , rhs_ty, op) ;
42- self . tcx . types . unit
43- } else {
44- return_ty
45- } ;
39+ let ty = if !lhs_ty. is_ty_var ( )
40+ && !rhs_ty. is_ty_var ( )
41+ && is_builtin_binop ( lhs_ty, rhs_ty, op. node )
42+ {
43+ self . enforce_builtin_binop_types ( lhs. span , lhs_ty, rhs. span , rhs_ty, op. node ) ;
44+ self . tcx . types . unit
45+ } else {
46+ return_ty
47+ } ;
4648
4749 self . check_lhs_assignable ( lhs, E0067 , op. span , |err| {
4850 if let Some ( lhs_deref_ty) = self . deref_once_mutably_for_diagnostic ( lhs_ty) {
4951 if self
5052 . lookup_op_method (
5153 ( lhs, lhs_deref_ty) ,
5254 Some ( ( rhs, rhs_ty) ) ,
53- lang_item_for_binop ( self . tcx , op, IsAssign :: Yes ) ,
55+ lang_item_for_binop ( self . tcx , op. node , IsAssign :: Yes ) ,
5456 op. span ,
5557 expected,
5658 )
@@ -62,7 +64,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
6264 . lookup_op_method (
6365 ( lhs, lhs_ty) ,
6466 Some ( ( rhs, rhs_ty) ) ,
65- lang_item_for_binop ( self . tcx , op, IsAssign :: Yes ) ,
67+ lang_item_for_binop ( self . tcx , op. node , IsAssign :: Yes ) ,
6668 op. span ,
6769 expected,
6870 )
@@ -101,7 +103,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
101103 expr. hir_id, expr, op, lhs_expr, rhs_expr
102104 ) ;
103105
104- match BinOpCategory :: from ( op) {
106+ match BinOpCategory :: from ( op. node ) {
105107 BinOpCategory :: Shortcircuit => {
106108 // && and || are a simple case.
107109 self . check_expr_coercible_to_type ( lhs_expr, tcx. types . bool , None ) ;
@@ -140,14 +142,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
140142 // can't pin this down to a specific impl.
141143 if !lhs_ty. is_ty_var ( )
142144 && !rhs_ty. is_ty_var ( )
143- && is_builtin_binop ( lhs_ty, rhs_ty, op)
145+ && is_builtin_binop ( lhs_ty, rhs_ty, op. node )
144146 {
145147 let builtin_return_ty = self . enforce_builtin_binop_types (
146148 lhs_expr. span ,
147149 lhs_ty,
148150 rhs_expr. span ,
149151 rhs_ty,
150- op,
152+ op. node ,
151153 ) ;
152154 self . demand_eqtype ( expr. span , builtin_return_ty, return_ty) ;
153155 builtin_return_ty
@@ -164,7 +166,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
164166 lhs_ty : Ty < ' tcx > ,
165167 rhs_span : Span ,
166168 rhs_ty : Ty < ' tcx > ,
167- op : hir:: BinOp ,
169+ op : hir:: BinOpKind ,
168170 ) -> Ty < ' tcx > {
169171 debug_assert ! ( is_builtin_binop( lhs_ty, rhs_ty, op) ) ;
170172
@@ -245,7 +247,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
245247 let result = self . lookup_op_method (
246248 ( lhs_expr, lhs_ty) ,
247249 Some ( ( rhs_expr, rhs_ty_var) ) ,
248- lang_item_for_binop ( self . tcx , op, is_assign) ,
250+ lang_item_for_binop ( self . tcx , op. node , is_assign) ,
249251 op. span ,
250252 expected,
251253 ) ;
@@ -256,7 +258,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
256258 rhs_ty_var,
257259 Some ( lhs_expr) ,
258260 |err, ty| {
259- self . suggest_swapping_lhs_and_rhs ( err, ty, lhs_ty, rhs_expr, lhs_expr, op) ;
261+ self . suggest_swapping_lhs_and_rhs ( err, ty, lhs_ty, rhs_expr, lhs_expr, op. node ) ;
260262 } ,
261263 ) ;
262264 let rhs_ty = self . resolve_vars_with_obligations ( rhs_ty) ;
@@ -305,7 +307,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
305307 Ty :: new_misc_error ( self . tcx )
306308 }
307309 Err ( errors) => {
308- let ( _, trait_def_id) = lang_item_for_binop ( self . tcx , op, is_assign) ;
310+ let ( _, trait_def_id) = lang_item_for_binop ( self . tcx , op. node , is_assign) ;
309311 let missing_trait = trait_def_id
310312 . map ( |def_id| with_no_trimmed_paths ! ( self . tcx. def_path_str( def_id) ) ) ;
311313 let mut path = None ;
@@ -412,7 +414,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
412414 . lookup_op_method (
413415 ( lhs_expr, lhs_deref_ty) ,
414416 Some ( ( rhs_expr, rhs_ty) ) ,
415- lang_item_for_binop ( self . tcx , op, is_assign) ,
417+ lang_item_for_binop ( self . tcx , op. node , is_assign) ,
416418 op. span ,
417419 expected,
418420 )
@@ -446,7 +448,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
446448 . lookup_op_method (
447449 ( lhs_expr, lhs_adjusted_ty) ,
448450 Some ( ( rhs_expr, rhs_adjusted_ty) ) ,
449- lang_item_for_binop ( self . tcx , op, is_assign) ,
451+ lang_item_for_binop ( self . tcx , op. node , is_assign) ,
450452 op. span ,
451453 expected,
452454 )
@@ -504,7 +506,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
504506 self . lookup_op_method (
505507 ( lhs_expr, lhs_ty) ,
506508 Some ( ( rhs_expr, rhs_ty) ) ,
507- lang_item_for_binop ( self . tcx , op, is_assign) ,
509+ lang_item_for_binop ( self . tcx , op. node , is_assign) ,
508510 op. span ,
509511 expected,
510512 )
@@ -598,7 +600,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
598600 . lookup_op_method (
599601 ( lhs_expr, lhs_ty) ,
600602 Some ( ( rhs_expr, rhs_ty) ) ,
601- lang_item_for_binop ( self . tcx , op, is_assign) ,
603+ lang_item_for_binop ( self . tcx , op. node , is_assign) ,
602604 op. span ,
603605 expected,
604606 )
@@ -992,12 +994,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
992994
993995fn lang_item_for_binop (
994996 tcx : TyCtxt < ' _ > ,
995- op : hir:: BinOp ,
997+ op : hir:: BinOpKind ,
996998 is_assign : IsAssign ,
997999) -> ( Symbol , Option < hir:: def_id:: DefId > ) {
9981000 let lang = tcx. lang_items ( ) ;
9991001 if is_assign == IsAssign :: Yes {
1000- match op. node {
1002+ match op {
10011003 hir:: BinOpKind :: Add => ( sym:: add_assign, lang. add_assign_trait ( ) ) ,
10021004 hir:: BinOpKind :: Sub => ( sym:: sub_assign, lang. sub_assign_trait ( ) ) ,
10031005 hir:: BinOpKind :: Mul => ( sym:: mul_assign, lang. mul_assign_trait ( ) ) ,
@@ -1016,11 +1018,11 @@ fn lang_item_for_binop(
10161018 | hir:: BinOpKind :: Ne
10171019 | hir:: BinOpKind :: And
10181020 | hir:: BinOpKind :: Or => {
1019- bug ! ( "impossible assignment operation: {}=" , op. node . as_str( ) )
1021+ bug ! ( "impossible assignment operation: {}=" , op. as_str( ) )
10201022 }
10211023 }
10221024 } else {
1023- match op. node {
1025+ match op {
10241026 hir:: BinOpKind :: Add => ( sym:: add, lang. add_trait ( ) ) ,
10251027 hir:: BinOpKind :: Sub => ( sym:: sub, lang. sub_trait ( ) ) ,
10261028 hir:: BinOpKind :: Mul => ( sym:: mul, lang. mul_trait ( ) ) ,
@@ -1077,8 +1079,8 @@ enum BinOpCategory {
10771079}
10781080
10791081impl BinOpCategory {
1080- fn from ( op : hir:: BinOp ) -> BinOpCategory {
1081- match op. node {
1082+ fn from ( op : hir:: BinOpKind ) -> BinOpCategory {
1083+ match op {
10821084 hir:: BinOpKind :: Shl | hir:: BinOpKind :: Shr => BinOpCategory :: Shift ,
10831085
10841086 hir:: BinOpKind :: Add
@@ -1134,7 +1136,7 @@ fn deref_ty_if_possible(ty: Ty<'_>) -> Ty<'_> {
11341136/// Reason #2 is the killer. I tried for a while to always use
11351137/// overloaded logic and just check the types in constants/codegen after
11361138/// the fact, and it worked fine, except for SIMD types. -nmatsakis
1137- fn is_builtin_binop < ' tcx > ( lhs : Ty < ' tcx > , rhs : Ty < ' tcx > , op : hir:: BinOp ) -> bool {
1139+ fn is_builtin_binop < ' tcx > ( lhs : Ty < ' tcx > , rhs : Ty < ' tcx > , op : hir:: BinOpKind ) -> bool {
11381140 // Special-case a single layer of referencing, so that things like `5.0 + &6.0f32` work.
11391141 // (See https://github.com/rust-lang/rust/issues/57447.)
11401142 let ( lhs, rhs) = ( deref_ty_if_possible ( lhs) , deref_ty_if_possible ( rhs) ) ;
0 commit comments