@@ -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 err, output_def_id) = match is_assign {
@@ -407,7 +409,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
407409 . lookup_op_method (
408410 ( lhs_expr, lhs_deref_ty) ,
409411 Some ( ( rhs_expr, rhs_ty) ) ,
410- lang_item_for_binop ( self . tcx , op, is_assign) ,
412+ lang_item_for_binop ( self . tcx , op. node , is_assign) ,
411413 op. span ,
412414 expected,
413415 )
@@ -441,7 +443,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
441443 . lookup_op_method (
442444 ( lhs_expr, lhs_adjusted_ty) ,
443445 Some ( ( rhs_expr, rhs_adjusted_ty) ) ,
444- lang_item_for_binop ( self . tcx , op, is_assign) ,
446+ lang_item_for_binop ( self . tcx , op. node , is_assign) ,
445447 op. span ,
446448 expected,
447449 )
@@ -497,7 +499,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
497499 self . lookup_op_method (
498500 ( lhs_expr, lhs_ty) ,
499501 Some ( ( rhs_expr, rhs_ty) ) ,
500- lang_item_for_binop ( self . tcx , op, is_assign) ,
502+ lang_item_for_binop ( self . tcx , op. node , is_assign) ,
501503 op. span ,
502504 expected,
503505 )
@@ -591,7 +593,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
591593 . lookup_op_method (
592594 ( lhs_expr, lhs_ty) ,
593595 Some ( ( rhs_expr, rhs_ty) ) ,
594- lang_item_for_binop ( self . tcx , op, is_assign) ,
596+ lang_item_for_binop ( self . tcx , op. node , is_assign) ,
595597 op. span ,
596598 expected,
597599 )
@@ -971,12 +973,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
971973
972974fn lang_item_for_binop (
973975 tcx : TyCtxt < ' _ > ,
974- op : hir:: BinOp ,
976+ op : hir:: BinOpKind ,
975977 is_assign : IsAssign ,
976978) -> ( Symbol , Option < hir:: def_id:: DefId > ) {
977979 let lang = tcx. lang_items ( ) ;
978980 if is_assign == IsAssign :: Yes {
979- match op. node {
981+ match op {
980982 hir:: BinOpKind :: Add => ( sym:: add_assign, lang. add_assign_trait ( ) ) ,
981983 hir:: BinOpKind :: Sub => ( sym:: sub_assign, lang. sub_assign_trait ( ) ) ,
982984 hir:: BinOpKind :: Mul => ( sym:: mul_assign, lang. mul_assign_trait ( ) ) ,
@@ -995,11 +997,11 @@ fn lang_item_for_binop(
995997 | hir:: BinOpKind :: Ne
996998 | hir:: BinOpKind :: And
997999 | hir:: BinOpKind :: Or => {
998- bug ! ( "impossible assignment operation: {}=" , op. node . as_str( ) )
1000+ bug ! ( "impossible assignment operation: {}=" , op. as_str( ) )
9991001 }
10001002 }
10011003 } else {
1002- match op. node {
1004+ match op {
10031005 hir:: BinOpKind :: Add => ( sym:: add, lang. add_trait ( ) ) ,
10041006 hir:: BinOpKind :: Sub => ( sym:: sub, lang. sub_trait ( ) ) ,
10051007 hir:: BinOpKind :: Mul => ( sym:: mul, lang. mul_trait ( ) ) ,
@@ -1056,8 +1058,8 @@ enum BinOpCategory {
10561058}
10571059
10581060impl BinOpCategory {
1059- fn from ( op : hir:: BinOp ) -> BinOpCategory {
1060- match op. node {
1061+ fn from ( op : hir:: BinOpKind ) -> BinOpCategory {
1062+ match op {
10611063 hir:: BinOpKind :: Shl | hir:: BinOpKind :: Shr => BinOpCategory :: Shift ,
10621064
10631065 hir:: BinOpKind :: Add
@@ -1113,7 +1115,7 @@ fn deref_ty_if_possible(ty: Ty<'_>) -> Ty<'_> {
11131115/// Reason #2 is the killer. I tried for a while to always use
11141116/// overloaded logic and just check the types in constants/codegen after
11151117/// the fact, and it worked fine, except for SIMD types. -nmatsakis
1116- fn is_builtin_binop < ' tcx > ( lhs : Ty < ' tcx > , rhs : Ty < ' tcx > , op : hir:: BinOp ) -> bool {
1118+ fn is_builtin_binop < ' tcx > ( lhs : Ty < ' tcx > , rhs : Ty < ' tcx > , op : hir:: BinOpKind ) -> bool {
11171119 // Special-case a single layer of referencing, so that things like `5.0 + &6.0f32` work.
11181120 // (See https://github.com/rust-lang/rust/issues/57447.)
11191121 let ( lhs, rhs) = ( deref_ty_if_possible ( lhs) , deref_ty_if_possible ( rhs) ) ;
0 commit comments