2015-08-11 18:53:50 +00:00
|
|
|
#![feature(plugin)]
|
|
|
|
#![plugin(clippy)]
|
|
|
|
|
2015-08-24 16:13:02 +00:00
|
|
|
#![allow(unused)]
|
2015-09-01 15:53:56 +00:00
|
|
|
#![deny(clippy, clippy_pedantic)]
|
2015-08-24 16:13:02 +00:00
|
|
|
|
|
|
|
use std::ops::Mul;
|
|
|
|
|
|
|
|
struct T;
|
|
|
|
|
|
|
|
impl T {
|
|
|
|
fn add(self, other: T) -> T { self } //~ERROR defining a method called `add`
|
|
|
|
fn drop(&mut self) { } //~ERROR defining a method called `drop`
|
|
|
|
|
|
|
|
fn sub(&self, other: T) -> &T { self } // no error, self is a ref
|
|
|
|
fn div(self) -> T { self } // no error, different #arguments
|
|
|
|
fn rem(self, other: T) { } // no error, wrong return type
|
2015-09-01 16:52:48 +00:00
|
|
|
|
|
|
|
fn into_u32(self) -> u32 { 0 } // fine
|
|
|
|
fn into_u16(&self) -> u16 { 0 } //~ERROR methods called `into_*` usually take self by value
|
2015-09-01 19:08:49 +00:00
|
|
|
|
|
|
|
fn to_something(self) -> u32 { 0 } //~ERROR methods called `to_*` usually take self by reference
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone,Copy)]
|
|
|
|
struct U;
|
|
|
|
|
|
|
|
impl U {
|
|
|
|
fn to_something(self) -> u32 { 0 } // ok because U is Copy
|
2015-08-24 16:13:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Mul<T> for T {
|
|
|
|
type Output = T;
|
|
|
|
fn mul(self, other: T) -> T { self } // no error, obviously
|
|
|
|
}
|
|
|
|
|
2015-08-11 18:53:50 +00:00
|
|
|
fn main() {
|
2015-11-19 13:39:27 +00:00
|
|
|
use std::io;
|
|
|
|
|
2015-08-11 18:53:50 +00:00
|
|
|
let opt = Some(0);
|
2015-08-13 06:12:07 +00:00
|
|
|
let _ = opt.unwrap(); //~ERROR used unwrap() on an Option
|
2015-08-11 18:53:50 +00:00
|
|
|
|
|
|
|
let res: Result<i32, ()> = Ok(0);
|
2015-08-13 06:12:07 +00:00
|
|
|
let _ = res.unwrap(); //~ERROR used unwrap() on a Result
|
2015-08-12 15:02:49 +00:00
|
|
|
|
2015-08-25 16:38:08 +00:00
|
|
|
let _ = "str".to_string(); //~ERROR `"str".to_owned()` is faster
|
|
|
|
|
|
|
|
let v = &"str";
|
|
|
|
let string = v.to_string(); //~ERROR `(*v).to_owned()` is faster
|
2015-08-13 06:12:07 +00:00
|
|
|
let _again = string.to_string(); //~ERROR `String.to_string()` is a no-op
|
2015-11-19 13:39:27 +00:00
|
|
|
|
|
|
|
res.ok().expect("disaster!"); //~ERROR called `ok().expect()`
|
|
|
|
// the following should not warn, since `expect` isn't implemented unless
|
|
|
|
// the error type implements `Debug`
|
|
|
|
let res2: Result<i32, MyError> = Ok(0);
|
|
|
|
res2.ok().expect("oh noes!");
|
2015-11-19 19:13:36 +00:00
|
|
|
// we currently don't warn if the error type has a type parameter
|
2015-11-19 13:39:27 +00:00
|
|
|
// (but it would be nice if we did)
|
|
|
|
let res3: Result<u32, MyErrorWithParam<u8>>= Ok(0);
|
|
|
|
res3.ok().expect("whoof");
|
|
|
|
let res4: Result<u32, io::Error> = Ok(0);
|
|
|
|
res4.ok().expect("argh"); //~ERROR called `ok().expect()`
|
|
|
|
let res5: io::Result<u32> = Ok(0);
|
|
|
|
res5.ok().expect("oops"); //~ERROR called `ok().expect()`
|
2015-11-19 19:13:36 +00:00
|
|
|
let res6: Result<u32, &str> = Ok(0);
|
|
|
|
res6.ok().expect("meh"); //~ERROR called `ok().expect()`
|
2015-11-19 13:39:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
struct MyError(()); // doesn't implement Debug
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
struct MyErrorWithParam<T> {
|
|
|
|
x: T
|
2015-08-11 18:53:50 +00:00
|
|
|
}
|