// Copyright 2014 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 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. // This test is to make sure we don't just ICE if the trait // method for an operator is not implemented properly. // (In this case the mul method should take &f64 and not f64) // See: #11450 use std::ops::Mul; struct Vec1 { x: f64 } // Expecting value in input signature impl Mul for Vec1 { type Output = Vec1; fn mul(self, s: &f64) -> Vec1 { //~^ ERROR method `mul` has an incompatible type for trait Vec1 { x: self.x * *s } } } struct Vec2 { x: f64, y: f64 } // Wrong type parameter ordering impl Mul for Vec2 { type Output = f64; fn mul(self, s: f64) -> Vec2 { //~^ ERROR method `mul` has an incompatible type for trait Vec2 { x: self.x * s, y: self.y * s } } } struct Vec3 { x: f64, y: f64, z: f64 } // Unexpected return type impl Mul for Vec3 { type Output = i32; fn mul(self, s: f64) -> f64 { //~^ ERROR method `mul` has an incompatible type for trait s } } pub fn main() { // Check that the usage goes from the trait declaration: let x: Vec1 = Vec1 { x: 1.0 } * 2.0; // this is OK let x: Vec2 = Vec2 { x: 1.0, y: 2.0 } * 2.0; // trait had reversed order // (we no longer signal a compile error here, since the // error in the trait signature will cause compilation to // abort before we bother looking at function bodies.) let x: i32 = Vec3 { x: 1.0, y: 2.0, z: 3.0 } * 2.0; }