// particularly for things like `String + &String`.
let rhs_ty_var = self.next_ty_var(TypeVariableOrigin::MiscVariable(rhs_expr.span));
- let return_ty = match self.lookup_op_method(expr, lhs_ty, vec![rhs_ty_var],
- Symbol::intern(name), trait_def_id,
- lhs_expr) {
+ let return_ty = self.lookup_op_method(expr, lhs_ty, vec![rhs_ty_var],
+ Symbol::intern(name), trait_def_id,
+ lhs_expr);
+
+ // see `NB` above
+ let rhs_ty = self.check_expr_coercable_to_type(rhs_expr, rhs_ty_var);
+
+ let return_ty = match return_ty {
Ok(return_ty) => return_ty,
Err(()) => {
// error types are considered "builtin"
if let TypeVariants::TyRef(_, ref ty_mut) = lhs_ty.sty {
if !self.infcx.type_moves_by_default(ty_mut.ty, lhs_expr.span) &&
- self.lookup_op_method(expr, ty_mut.ty, vec![rhs_ty_var],
+ self.lookup_op_method(expr, ty_mut.ty, vec![rhs_ty],
Symbol::intern(name), trait_def_id,
lhs_expr).is_ok() {
err.note(
if let Some(missing_trait) = missing_trait {
if missing_trait == "std::ops::Add" &&
self.check_str_addition(expr, lhs_expr, lhs_ty,
- rhs_expr, rhs_ty_var, &mut err) {
+ rhs_expr, rhs_ty, &mut err) {
// This has nothing here because it means we did string
// concatenation (e.g. "Hello " + "World!"). This means
// we don't want the note in the else clause to be emitted
}
};
- // see `NB` above
- self.check_expr_coercable_to_type(rhs_expr, rhs_ty_var);
-
(rhs_ty_var, return_ty)
}
lhs_expr: &'gcx hir::Expr,
lhs_ty: Ty<'tcx>,
rhs_expr: &'gcx hir::Expr,
- rhs_ty_var: Ty<'tcx>,
+ rhs_ty: Ty<'tcx>,
mut err: &mut errors::DiagnosticBuilder) -> bool {
// If this function returns true it means a note was printed, so we don't need
// to print the normal "implementation of `std::ops::Add` might be missing" note
let mut is_string_addition = false;
- let rhs_ty = self.check_expr_coercable_to_type(rhs_expr, rhs_ty_var);
if let TyRef(_, l_ty) = lhs_ty.sty {
if let TyRef(_, r_ty) = rhs_ty.sty {
if l_ty.ty.sty == TyStr && r_ty.ty.sty == TyStr {
--- /dev/null
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn f(_: &[f32]) {}
+
+fn main() {
+ () + f(&[1.0]);
+ //~^ ERROR binary operation `+` cannot be applied to type `()`
+}
--- /dev/null
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn f(_: &[f32]) {}
+
+fn main() {
+ ()[f(&[1.0])];
+ //~^ ERROR cannot index a value of type `()`
+}