From 3af04c7816dbff3d14d2e56a23495abe06835e7f Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 21 Feb 2017 11:11:33 +0100 Subject: [PATCH 1/6] Cleanup test suite --- tests/compile-fail/methods.rs | 689 --------------------- tests/compile-fail/non_expressive_names.rs | 150 ----- tests/compile-fail/strings.rs | 73 --- tests/compile-fail/swap.rs | 84 --- tests/ui-posix/update-all-references.sh | 31 + tests/ui-posix/update-references.sh | 50 ++ tests/ui-windows/update-all-references.sh | 31 + tests/ui-windows/update-references.sh | 50 ++ 8 files changed, 162 insertions(+), 996 deletions(-) delete mode 100644 tests/compile-fail/methods.rs delete mode 100644 tests/compile-fail/non_expressive_names.rs delete mode 100644 tests/compile-fail/strings.rs delete mode 100644 tests/compile-fail/swap.rs create mode 100755 tests/ui-posix/update-all-references.sh create mode 100755 tests/ui-posix/update-references.sh create mode 100755 tests/ui-windows/update-all-references.sh create mode 100755 tests/ui-windows/update-references.sh diff --git a/tests/compile-fail/methods.rs b/tests/compile-fail/methods.rs deleted file mode 100644 index 34a0773df27..00000000000 --- a/tests/compile-fail/methods.rs +++ /dev/null @@ -1,689 +0,0 @@ -#![feature(plugin)] -#![feature(const_fn)] -#![plugin(clippy)] - -#![deny(clippy, clippy_pedantic)] -#![allow(blacklisted_name, unused, print_stdout, non_ascii_literal, new_without_default, new_without_default_derive, missing_docs_in_private_items)] - -use std::collections::BTreeMap; -use std::collections::HashMap; -use std::collections::HashSet; -use std::collections::VecDeque; -use std::ops::Mul; -use std::iter::FromIterator; - -struct T; - -impl T { - fn add(self, other: T) -> T { self } - fn drop(&mut self) { } - - 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 - - fn into_u32(self) -> u32 { 0 } // fine - fn into_u16(&self) -> u16 { 0 } - - fn to_something(self) -> u32 { 0 } - - fn new(self) {} -} - -struct Lt<'a> { - foo: &'a u32, -} - -impl<'a> Lt<'a> { - // The lifetime is different, but that’s irrelevant, see #734 - #[allow(needless_lifetimes)] - pub fn new<'b>(s: &'b str) -> Lt<'b> { unimplemented!() } -} - -struct Lt2<'a> { - foo: &'a u32, -} - -impl<'a> Lt2<'a> { - // The lifetime is different, but that’s irrelevant, see #734 - pub fn new(s: &str) -> Lt2 { unimplemented!() } -} - -struct Lt3<'a> { - foo: &'a u32, -} - -impl<'a> Lt3<'a> { - // The lifetime is different, but that’s irrelevant, see #734 - pub fn new() -> Lt3<'static> { unimplemented!() } -} - -#[derive(Clone,Copy)] -struct U; - -impl U { - fn new() -> Self { U } - fn to_something(self) -> u32 { 0 } // ok because U is Copy -} - -struct V { - _dummy: T -} - -impl V { - fn new() -> Option> { None } -} - -impl Mul for T { - type Output = T; - fn mul(self, other: T) -> T { self } // no error, obviously -} - -/// Utility macro to test linting behavior in `option_methods()` -/// The lints included in `option_methods()` should not lint if the call to map is partially -/// within a macro -macro_rules! opt_map { - ($opt:expr, $map:expr) => {($opt).map($map)}; -} - -/// Checks implementation of the following lints: -/// * `OPTION_MAP_UNWRAP_OR` -/// * `OPTION_MAP_UNWRAP_OR_ELSE` -fn option_methods() { - let opt = Some(1); - - // Check OPTION_MAP_UNWRAP_OR - // single line case - let _ = opt.map(|x| x + 1) - - .unwrap_or(0); // should lint even though this call is on a separate line - // multi line cases - let _ = opt.map(|x| { - x + 1 - } - ).unwrap_or(0); - let _ = opt.map(|x| x + 1) - .unwrap_or({ - 0 - }); - // macro case - let _ = opt_map!(opt, |x| x + 1).unwrap_or(0); // should not lint - - // Check OPTION_MAP_UNWRAP_OR_ELSE - // single line case - let _ = opt.map(|x| x + 1) - - .unwrap_or_else(|| 0); // should lint even though this call is on a separate line - // multi line cases - let _ = opt.map(|x| { - x + 1 - } - ).unwrap_or_else(|| 0); - let _ = opt.map(|x| x + 1) - .unwrap_or_else(|| - 0 - ); - // macro case - let _ = opt_map!(opt, |x| x + 1).unwrap_or_else(|| 0); // should not lint -} - -/// Struct to generate false positives for things with .iter() -#[derive(Copy, Clone)] -struct HasIter; - -impl HasIter { - fn iter(self) -> IteratorFalsePositives { - IteratorFalsePositives { foo: 0 } - } - - fn iter_mut(self) -> IteratorFalsePositives { - IteratorFalsePositives { foo: 0 } - } -} - -/// Struct to generate false positive for Iterator-based lints -#[derive(Copy, Clone)] -struct IteratorFalsePositives { - foo: u32, -} - -impl IteratorFalsePositives { - fn filter(self) -> IteratorFalsePositives { - self - } - - fn next(self) -> IteratorFalsePositives { - self - } - - fn find(self) -> Option { - Some(self.foo) - } - - fn position(self) -> Option { - Some(self.foo) - } - - fn rposition(self) -> Option { - Some(self.foo) - } - - fn nth(self, n: usize) -> Option { - Some(self.foo) - } - - fn skip(self, _: usize) -> IteratorFalsePositives { - self - } -} - -#[derive(Copy, Clone)] -struct HasChars; - -impl HasChars { - fn chars(self) -> std::str::Chars<'static> { - "HasChars".chars() - } -} - -/// Checks implementation of `FILTER_NEXT` lint -fn filter_next() { - let v = vec![3, 2, 1, 0, -1, -2, -3]; - - // check single-line case - let _ = v.iter().filter(|&x| *x < 0).next(); - - - - // check multi-line case - let _ = v.iter().filter(|&x| { - *x < 0 - } - ).next(); - - // check that we don't lint if the caller is not an Iterator - let foo = IteratorFalsePositives { foo: 0 }; - let _ = foo.filter().next(); -} - -/// Checks implementation of `SEARCH_IS_SOME` lint -fn search_is_some() { - let v = vec![3, 2, 1, 0, -1, -2, -3]; - - // check `find().is_some()`, single-line - let _ = v.iter().find(|&x| *x < 0).is_some(); - - - - // check `find().is_some()`, multi-line - let _ = v.iter().find(|&x| { - *x < 0 - } - ).is_some(); - - // check `position().is_some()`, single-line - let _ = v.iter().position(|&x| x < 0).is_some(); - - - - // check `position().is_some()`, multi-line - let _ = v.iter().position(|&x| { - x < 0 - } - ).is_some(); - - // check `rposition().is_some()`, single-line - let _ = v.iter().rposition(|&x| x < 0).is_some(); - - - - // check `rposition().is_some()`, multi-line - let _ = v.iter().rposition(|&x| { - x < 0 - } - ).is_some(); - - // check that we don't lint if the caller is not an Iterator - let foo = IteratorFalsePositives { foo: 0 }; - let _ = foo.find().is_some(); - let _ = foo.position().is_some(); - let _ = foo.rposition().is_some(); -} - -/// Checks implementation of the `OR_FUN_CALL` lint -fn or_fun_call() { - struct Foo; - - impl Foo { - fn new() -> Foo { Foo } - } - - enum Enum { - A(i32), - } - - const fn make_const(i: i32) -> i32 { i } - - fn make() -> T { unimplemented!(); } - - let with_enum = Some(Enum::A(1)); - with_enum.unwrap_or(Enum::A(5)); - - let with_const_fn = Some(1); - with_const_fn.unwrap_or(make_const(5)); - - let with_constructor = Some(vec![1]); - with_constructor.unwrap_or(make()); - - - - - let with_new = Some(vec![1]); - with_new.unwrap_or(Vec::new()); - - - - - let with_const_args = Some(vec![1]); - with_const_args.unwrap_or(Vec::with_capacity(12)); - - - - - let with_err : Result<_, ()> = Ok(vec![1]); - with_err.unwrap_or(make()); - - - - - let with_err_args : Result<_, ()> = Ok(vec![1]); - with_err_args.unwrap_or(Vec::with_capacity(12)); - - - - - let with_default_trait = Some(1); - with_default_trait.unwrap_or(Default::default()); - - - - - let with_default_type = Some(1); - with_default_type.unwrap_or(u64::default()); - - - - - let with_vec = Some(vec![1]); - with_vec.unwrap_or(vec![]); - - - // FIXME #944: ~|SUGGESTION with_vec.unwrap_or_else(|| vec![]); - - let without_default = Some(Foo); - without_default.unwrap_or(Foo::new()); - - - - - let mut map = HashMap::::new(); - map.entry(42).or_insert(String::new()); - - - - - let mut btree = BTreeMap::::new(); - btree.entry(42).or_insert(String::new()); - - - - - let stringy = Some(String::from("")); - let _ = stringy.unwrap_or("".to_owned()); - - - -} - -/// Checks implementation of `ITER_NTH` lint -fn iter_nth() { - let mut some_vec = vec![0, 1, 2, 3]; - let mut boxed_slice: Box<[u8]> = Box::new([0, 1, 2, 3]); - let mut some_vec_deque: VecDeque<_> = some_vec.iter().cloned().collect(); - - { - // Make sure we lint `.iter()` for relevant types - let bad_vec = some_vec.iter().nth(3); - - let bad_slice = &some_vec[..].iter().nth(3); - - let bad_boxed_slice = boxed_slice.iter().nth(3); - - let bad_vec_deque = some_vec_deque.iter().nth(3); - - } - - { - // Make sure we lint `.iter_mut()` for relevant types - let bad_vec = some_vec.iter_mut().nth(3); - - } - { - let bad_slice = &some_vec[..].iter_mut().nth(3); - - } - { - let bad_vec_deque = some_vec_deque.iter_mut().nth(3); - - } - - // Make sure we don't lint for non-relevant types - let false_positive = HasIter; - let ok = false_positive.iter().nth(3); - let ok_mut = false_positive.iter_mut().nth(3); -} - -/// Checks implementation of `ITER_SKIP_NEXT` lint -fn iter_skip_next() { - let mut some_vec = vec![0, 1, 2, 3]; - - let _ = some_vec.iter().skip(42).next(); - - - let _ = some_vec.iter().cycle().skip(42).next(); - - - let _ = (1..10).skip(10).next(); - - - let _ = &some_vec[..].iter().skip(3).next(); - - - let foo = IteratorFalsePositives { foo : 0 }; - let _ = foo.skip(42).next(); - let _ = foo.filter().skip(42).next(); -} - -struct GetFalsePositive { - arr: [u32; 3], -} - -impl GetFalsePositive { - fn get(&self, pos: usize) -> Option<&u32> { self.arr.get(pos) } - fn get_mut(&mut self, pos: usize) -> Option<&mut u32> { self.arr.get_mut(pos) } -} - -/// Checks implementation of `GET_UNWRAP` lint -fn get_unwrap() { - let mut boxed_slice: Box<[u8]> = Box::new([0, 1, 2, 3]); - let mut some_slice = &mut [0, 1, 2, 3]; - let mut some_vec = vec![0, 1, 2, 3]; - let mut some_vecdeque: VecDeque<_> = some_vec.iter().cloned().collect(); - let mut some_hashmap: HashMap = HashMap::from_iter(vec![(1, 'a'), (2, 'b')]); - let mut some_btreemap: BTreeMap = BTreeMap::from_iter(vec![(1, 'a'), (2, 'b')]); - let mut false_positive = GetFalsePositive { arr: [0, 1, 2] }; - - { // Test `get().unwrap()` - let _ = boxed_slice.get(1).unwrap(); - - - - let _ = some_slice.get(0).unwrap(); - - - - let _ = some_vec.get(0).unwrap(); - - - - let _ = some_vecdeque.get(0).unwrap(); - - - - let _ = some_hashmap.get(&1).unwrap(); - - - - let _ = some_btreemap.get(&1).unwrap(); - - - - - let _ = false_positive.get(0).unwrap(); - } - - { // Test `get_mut().unwrap()` - *boxed_slice.get_mut(0).unwrap() = 1; - - - - *some_slice.get_mut(0).unwrap() = 1; - - - - *some_vec.get_mut(0).unwrap() = 1; - - - - *some_vecdeque.get_mut(0).unwrap() = 1; - - - - - // Check false positives - *some_hashmap.get_mut(&1).unwrap() = 'b'; - *some_btreemap.get_mut(&1).unwrap() = 'b'; - *false_positive.get_mut(0).unwrap() = 1; - } -} - - -#[allow(similar_names)] -fn main() { - use std::io; - - let opt = Some(0); - let _ = opt.unwrap(); - - let res: Result = Ok(0); - let _ = res.unwrap(); - - res.ok().expect("disaster!"); - // the following should not warn, since `expect` isn't implemented unless - // the error type implements `Debug` - let res2: Result = Ok(0); - res2.ok().expect("oh noes!"); - let res3: Result>= Ok(0); - res3.ok().expect("whoof"); - let res4: Result = Ok(0); - res4.ok().expect("argh"); - let res5: io::Result = Ok(0); - res5.ok().expect("oops"); - let res6: Result = Ok(0); - res6.ok().expect("meh"); -} - -struct MyError(()); // doesn't implement Debug - -#[derive(Debug)] -struct MyErrorWithParam { - x: T -} - -#[allow(unnecessary_operation)] -fn starts_with() { - "".chars().next() == Some(' '); - - - - - Some(' ') != "".chars().next(); - - - -} - -fn str_extend_chars() { - let abc = "abc"; - let def = String::from("def"); - let mut s = String::new(); - - s.push_str(abc); - s.extend(abc.chars()); - - - - - s.push_str("abc"); - s.extend("abc".chars()); - - - - - s.push_str(&def); - s.extend(def.chars()); - - - - - s.extend(abc.chars().skip(1)); - s.extend("abc".chars().skip(1)); - s.extend(['a', 'b', 'c'].iter()); - - let f = HasChars; - s.extend(f.chars()); -} - -fn clone_on_copy() { - 42.clone(); - - - vec![1].clone(); // ok, not a Copy type - Some(vec![1]).clone(); // ok, not a Copy type - (&42).clone(); - - -} - -fn clone_on_copy_generic(t: T) { - t.clone(); - - - Some(t).clone(); - - -} - -fn clone_on_double_ref() { - let x = vec![1]; - let y = &&x; - let z: &Vec<_> = y.clone(); - - - println!("{:p} {:p}",*y, z); -} - -fn single_char_pattern() { - let x = "foo"; - x.split("x"); - - - - - x.split("xx"); - - x.split('x'); - - let y = "x"; - x.split(y); - - // Not yet testing for multi-byte characters - // Changing `r.len() == 1` to `r.chars().count() == 1` in `lint_single_char_pattern` - // should have done this but produced an ICE - // - // We may not want to suggest changing these anyway - // See: https://github.com/Manishearth/rust-clippy/issues/650#issuecomment-184328984 - x.split("ß"); - x.split("ℝ"); - x.split("💣"); - // Can't use this lint for unicode code points which don't fit in a char - x.split("❤️"); - - x.contains("x"); - - - - x.starts_with("x"); - - - - x.ends_with("x"); - - - - x.find("x"); - - - - x.rfind("x"); - - - - x.rsplit("x"); - - - - x.split_terminator("x"); - - - - x.rsplit_terminator("x"); - - - - x.splitn(0, "x"); - - - - x.rsplitn(0, "x"); - - - - x.matches("x"); - - - - x.rmatches("x"); - - - - x.match_indices("x"); - - - - x.rmatch_indices("x"); - - - - x.trim_left_matches("x"); - - - - x.trim_right_matches("x"); - - - - - let h = HashSet::::new(); - h.contains("X"); // should not warn -} - -#[allow(result_unwrap_used)] -fn temporary_cstring() { - use std::ffi::CString; - - CString::new("foo").unwrap().as_ptr(); - - - -} diff --git a/tests/compile-fail/non_expressive_names.rs b/tests/compile-fail/non_expressive_names.rs deleted file mode 100644 index 649a5ecb812..00000000000 --- a/tests/compile-fail/non_expressive_names.rs +++ /dev/null @@ -1,150 +0,0 @@ -#![feature(plugin)] -#![plugin(clippy)] -#![deny(clippy,similar_names)] - - - - - - - - - - - -#![allow(unused)] - - -struct Foo { - apple: i32, - bpple: i32, -} - -fn main() { - let specter: i32; - let spectre: i32; - - let apple: i32; - - let bpple: i32; - - let cpple: i32; - - - let a_bar: i32; - let b_bar: i32; - let c_bar: i32; - - let items = [5]; - for item in &items { - loop {} - } - - let foo_x: i32; - let foo_y: i32; - - let rhs: i32; - let lhs: i32; - - let bla_rhs: i32; - let bla_lhs: i32; - - let blubrhs: i32; - let blublhs: i32; - - let blubx: i32; - let bluby: i32; - - - let cake: i32; - let cakes: i32; - let coke: i32; - - match 5 { - cheese @ 1 => {}, - rabbit => panic!(), - } - let cheese: i32; - match (42, 43) { - (cheese1, 1) => {}, - (cheese2, 2) => panic!(), - _ => println!(""), - } - let ipv4: i32; - let ipv6: i32; - let abcd1: i32; - let abdc2: i32; - let xyz1abc: i32; - let xyz2abc: i32; - let xyzeabc: i32; - - let parser: i32; - let parsed: i32; - let parsee: i32; - - - let setter: i32; - let getter: i32; - let tx1: i32; - let rx1: i32; - let tx_cake: i32; - let rx_cake: i32; -} - -fn foo() { - let Foo { apple, bpple } = unimplemented!(); - let Foo { apple: spring, - bpple: sprang } = unimplemented!(); -} - -#[derive(Clone, Debug)] -enum MaybeInst { - Split, - Split1(usize), - Split2(usize), -} - -struct InstSplit { - uiae: usize, -} - -impl MaybeInst { - fn fill(&mut self) { - let filled = match *self { - MaybeInst::Split1(goto1) => panic!(1), - MaybeInst::Split2(goto2) => panic!(2), - _ => unimplemented!(), - }; - unimplemented!() - } -} - -fn bla() { - let a: i32; - let (b, c, d): (i32, i64, i16); - { - { - let cdefg: i32; - let blar: i32; - } - { - let e: i32; - - } - { - let e: i32; - - let f: i32; - - } - match 5 { - 1 => println!(""), - e => panic!(), - - } - match 5 { - 1 => println!(""), - _ => panic!(), - } - } -} diff --git a/tests/compile-fail/strings.rs b/tests/compile-fail/strings.rs deleted file mode 100644 index f893d99491b..00000000000 --- a/tests/compile-fail/strings.rs +++ /dev/null @@ -1,73 +0,0 @@ -#![feature(plugin)] -#![plugin(clippy)] - -#[deny(string_add)] -#[allow(string_add_assign)] -fn add_only() { // ignores assignment distinction - let mut x = "".to_owned(); - - for _ in 1..3 { - x = x + "."; - } - - let y = "".to_owned(); - let z = y + "..."; - - assert_eq!(&x, &z); -} - -#[deny(string_add_assign)] -fn add_assign_only() { - let mut x = "".to_owned(); - - for _ in 1..3 { - x = x + "."; - } - - let y = "".to_owned(); - let z = y + "..."; - - assert_eq!(&x, &z); -} - -#[deny(string_add, string_add_assign)] -fn both() { - let mut x = "".to_owned(); - - for _ in 1..3 { - x = x + "."; - } - - let y = "".to_owned(); - let z = y + "..."; - - assert_eq!(&x, &z); -} - -#[allow(dead_code, unused_variables)] -#[deny(string_lit_as_bytes)] -fn str_lit_as_bytes() { - let bs = "hello there".as_bytes(); - - - - - // no warning, because this cannot be written as a byte string literal: - let ubs = "☃".as_bytes(); - - let strify = stringify!(foobar).as_bytes(); -} - -fn main() { - add_only(); - add_assign_only(); - both(); - - // the add is only caught for `String` - let mut x = 1; - ; x = x + 1; - - - - assert_eq!(2, x); -} diff --git a/tests/compile-fail/swap.rs b/tests/compile-fail/swap.rs deleted file mode 100644 index 95478dda0d3..00000000000 --- a/tests/compile-fail/swap.rs +++ /dev/null @@ -1,84 +0,0 @@ -#![feature(plugin)] -#![plugin(clippy)] - -#![deny(clippy)] -#![allow(blacklisted_name, unused_assignments)] - -struct Foo(u32); - -fn array() { - let mut foo = [1, 2]; - let temp = foo[0]; - foo[0] = foo[1]; - foo[1] = temp; - - - - - foo.swap(0, 1); -} - -fn slice() { - let foo = &mut [1, 2]; - let temp = foo[0]; - foo[0] = foo[1]; - foo[1] = temp; - - - - - foo.swap(0, 1); -} - -fn vec() { - let mut foo = vec![1, 2]; - let temp = foo[0]; - foo[0] = foo[1]; - foo[1] = temp; - - - - - foo.swap(0, 1); -} - -fn main() { - array(); - slice(); - vec(); - - let mut a = 42; - let mut b = 1337; - - a = b; - b = a; - - - - - - ; let t = a; - a = b; - b = t; - - - - - - let mut c = Foo(42); - - c.0 = a; - a = c.0; - - - - - - ; let t = c.0; - c.0 = a; - a = t; - - - - -} diff --git a/tests/ui-posix/update-all-references.sh b/tests/ui-posix/update-all-references.sh new file mode 100755 index 00000000000..ddd69c399a5 --- /dev/null +++ b/tests/ui-posix/update-all-references.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# +# Copyright 2015 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. + +# A script to update the references for all tests. The idea is that +# you do a run, which will generate files in the build directory +# containing the (normalized) actual output of the compiler. You then +# run this script, which will copy those files over. If you find +# yourself manually editing a foo.stderr file, you're doing it wrong. +# +# See all `update-references.sh`, if you just want to update a single test. + +if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" || "$2" != "" ]]; then + echo "usage: $0 " + echo "" + echo "For example:" + echo " $0 ../../../build/x86_64-apple-darwin/test/ui" +fi + +BUILD_DIR=$PWD/$1 +MY_DIR=$(dirname $0) +cd $MY_DIR +find . -name '*.rs' | xargs ./update-references.sh $BUILD_DIR diff --git a/tests/ui-posix/update-references.sh b/tests/ui-posix/update-references.sh new file mode 100755 index 00000000000..aa99d35f7aa --- /dev/null +++ b/tests/ui-posix/update-references.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# +# Copyright 2015 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. + +# A script to update the references for particular tests. The idea is +# that you do a run, which will generate files in the build directory +# containing the (normalized) actual output of the compiler. This +# script will then copy that output and replace the "expected output" +# files. You can then commit the changes. +# +# If you find yourself manually editing a foo.stderr file, you're +# doing it wrong. + +if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" || "$2" == "" ]]; then + echo "usage: $0 " + echo "" + echo "For example:" + echo " $0 ../../../build/x86_64-apple-darwin/test/ui *.rs */*.rs" +fi + +MYDIR=$(dirname $0) + +BUILD_DIR="$1" +shift + +while [[ "$1" != "" ]]; do + STDERR_NAME="${1/%.rs/.stderr}" + STDOUT_NAME="${1/%.rs/.stdout}" + shift + if [ -f $BUILD_DIR/$STDOUT_NAME ] && \ + ! (diff $BUILD_DIR/$STDOUT_NAME $MYDIR/$STDOUT_NAME >& /dev/null); then + echo updating $MYDIR/$STDOUT_NAME + cp $BUILD_DIR/$STDOUT_NAME $MYDIR/$STDOUT_NAME + fi + if [ -f $BUILD_DIR/$STDERR_NAME ] && \ + ! (diff $BUILD_DIR/$STDERR_NAME $MYDIR/$STDERR_NAME >& /dev/null); then + echo updating $MYDIR/$STDERR_NAME + cp $BUILD_DIR/$STDERR_NAME $MYDIR/$STDERR_NAME + fi +done + + diff --git a/tests/ui-windows/update-all-references.sh b/tests/ui-windows/update-all-references.sh new file mode 100755 index 00000000000..ddd69c399a5 --- /dev/null +++ b/tests/ui-windows/update-all-references.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# +# Copyright 2015 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. + +# A script to update the references for all tests. The idea is that +# you do a run, which will generate files in the build directory +# containing the (normalized) actual output of the compiler. You then +# run this script, which will copy those files over. If you find +# yourself manually editing a foo.stderr file, you're doing it wrong. +# +# See all `update-references.sh`, if you just want to update a single test. + +if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" || "$2" != "" ]]; then + echo "usage: $0 " + echo "" + echo "For example:" + echo " $0 ../../../build/x86_64-apple-darwin/test/ui" +fi + +BUILD_DIR=$PWD/$1 +MY_DIR=$(dirname $0) +cd $MY_DIR +find . -name '*.rs' | xargs ./update-references.sh $BUILD_DIR diff --git a/tests/ui-windows/update-references.sh b/tests/ui-windows/update-references.sh new file mode 100755 index 00000000000..aa99d35f7aa --- /dev/null +++ b/tests/ui-windows/update-references.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# +# Copyright 2015 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. + +# A script to update the references for particular tests. The idea is +# that you do a run, which will generate files in the build directory +# containing the (normalized) actual output of the compiler. This +# script will then copy that output and replace the "expected output" +# files. You can then commit the changes. +# +# If you find yourself manually editing a foo.stderr file, you're +# doing it wrong. + +if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" || "$2" == "" ]]; then + echo "usage: $0 " + echo "" + echo "For example:" + echo " $0 ../../../build/x86_64-apple-darwin/test/ui *.rs */*.rs" +fi + +MYDIR=$(dirname $0) + +BUILD_DIR="$1" +shift + +while [[ "$1" != "" ]]; do + STDERR_NAME="${1/%.rs/.stderr}" + STDOUT_NAME="${1/%.rs/.stdout}" + shift + if [ -f $BUILD_DIR/$STDOUT_NAME ] && \ + ! (diff $BUILD_DIR/$STDOUT_NAME $MYDIR/$STDOUT_NAME >& /dev/null); then + echo updating $MYDIR/$STDOUT_NAME + cp $BUILD_DIR/$STDOUT_NAME $MYDIR/$STDOUT_NAME + fi + if [ -f $BUILD_DIR/$STDERR_NAME ] && \ + ! (diff $BUILD_DIR/$STDERR_NAME $MYDIR/$STDERR_NAME >& /dev/null); then + echo updating $MYDIR/$STDERR_NAME + cp $BUILD_DIR/$STDERR_NAME $MYDIR/$STDERR_NAME + fi +done + + From 89d98a8732f53ef8b319682bc6c665c72838874e Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 21 Feb 2017 11:18:05 +0100 Subject: [PATCH 2/6] Simplify calling `update-all-references.sh` --- tests/ui-posix/update-all-references.sh | 9 +++------ tests/ui-windows/update-all-references.sh | 9 +++------ tests/ui/update-all-references.sh | 9 +++------ 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/tests/ui-posix/update-all-references.sh b/tests/ui-posix/update-all-references.sh index ddd69c399a5..d6aa69c7e8d 100755 --- a/tests/ui-posix/update-all-references.sh +++ b/tests/ui-posix/update-all-references.sh @@ -18,14 +18,11 @@ # # See all `update-references.sh`, if you just want to update a single test. -if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" || "$2" != "" ]]; then - echo "usage: $0 " - echo "" - echo "For example:" - echo " $0 ../../../build/x86_64-apple-darwin/test/ui" +if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" ]]; then + echo "usage: $0" fi -BUILD_DIR=$PWD/$1 +BUILD_DIR=$PWD/target/debug/test_build_base MY_DIR=$(dirname $0) cd $MY_DIR find . -name '*.rs' | xargs ./update-references.sh $BUILD_DIR diff --git a/tests/ui-windows/update-all-references.sh b/tests/ui-windows/update-all-references.sh index ddd69c399a5..d6aa69c7e8d 100755 --- a/tests/ui-windows/update-all-references.sh +++ b/tests/ui-windows/update-all-references.sh @@ -18,14 +18,11 @@ # # See all `update-references.sh`, if you just want to update a single test. -if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" || "$2" != "" ]]; then - echo "usage: $0 " - echo "" - echo "For example:" - echo " $0 ../../../build/x86_64-apple-darwin/test/ui" +if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" ]]; then + echo "usage: $0" fi -BUILD_DIR=$PWD/$1 +BUILD_DIR=$PWD/target/debug/test_build_base MY_DIR=$(dirname $0) cd $MY_DIR find . -name '*.rs' | xargs ./update-references.sh $BUILD_DIR diff --git a/tests/ui/update-all-references.sh b/tests/ui/update-all-references.sh index ddd69c399a5..d6aa69c7e8d 100755 --- a/tests/ui/update-all-references.sh +++ b/tests/ui/update-all-references.sh @@ -18,14 +18,11 @@ # # See all `update-references.sh`, if you just want to update a single test. -if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" || "$2" != "" ]]; then - echo "usage: $0 " - echo "" - echo "For example:" - echo " $0 ../../../build/x86_64-apple-darwin/test/ui" +if [[ "$1" == "--help" || "$1" == "-h" || "$1" == "" ]]; then + echo "usage: $0" fi -BUILD_DIR=$PWD/$1 +BUILD_DIR=$PWD/target/debug/test_build_base MY_DIR=$(dirname $0) cd $MY_DIR find . -name '*.rs' | xargs ./update-references.sh $BUILD_DIR From ff655a7dbc90c24537dbfeaf4693c54617745bcf Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 21 Feb 2017 12:12:08 +0100 Subject: [PATCH 3/6] Ui windows test paths are wrong --- tests/ui-windows/conf_bad_toml.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ui-windows/conf_bad_toml.rs b/tests/ui-windows/conf_bad_toml.rs index b5ea6d96ef5..69ce68c25df 100644 --- a/tests/ui-windows/conf_bad_toml.rs +++ b/tests/ui-windows/conf_bad_toml.rs @@ -1,6 +1,6 @@ // error-pattern: error reading Clippy's configuration file #![feature(plugin)] -#![plugin(clippy(conf_file="./tests/compile-fail/conf_bad_toml.toml"))] +#![plugin(clippy(conf_file="./tests/ui-windows/conf_bad_toml.toml"))] fn main() {} From 0996f8bb007cbff94f9fc22a6b14636a6f015500 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 21 Feb 2017 12:12:45 +0100 Subject: [PATCH 4/6] Fix more wrong windows ui test paths --- tests/ui-windows/conf_bad_type.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ui-windows/conf_bad_type.rs b/tests/ui-windows/conf_bad_type.rs index 8dc3e4ec2e6..eaaac0ea86d 100644 --- a/tests/ui-windows/conf_bad_type.rs +++ b/tests/ui-windows/conf_bad_type.rs @@ -1,6 +1,6 @@ // error-pattern: error reading Clippy's configuration file: `blacklisted-names` is expected to be a `Vec < String >` but is a `integer` #![feature(plugin)] -#![plugin(clippy(conf_file="./tests/compile-fail/conf_bad_type.toml"))] +#![plugin(clippy(conf_file="./tests/ui-windows/conf_bad_type.toml"))] fn main() {} From f10128369b42b51828160bd6b67f3c8c77a21a1f Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 21 Feb 2017 12:16:57 +0100 Subject: [PATCH 5/6] fix ui-posix test paths --- tests/ui-posix/conf_bad_toml.rs | 2 +- tests/ui-posix/conf_bad_toml.stderr | 2 +- tests/ui-posix/conf_bad_type.rs | 2 +- tests/ui-posix/conf_bad_type.stderr | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/ui-posix/conf_bad_toml.rs b/tests/ui-posix/conf_bad_toml.rs index b5ea6d96ef5..d80a9c8edeb 100644 --- a/tests/ui-posix/conf_bad_toml.rs +++ b/tests/ui-posix/conf_bad_toml.rs @@ -1,6 +1,6 @@ // error-pattern: error reading Clippy's configuration file #![feature(plugin)] -#![plugin(clippy(conf_file="./tests/compile-fail/conf_bad_toml.toml"))] +#![plugin(clippy(conf_file="./tests/ui-posix/conf_bad_toml.toml"))] fn main() {} diff --git a/tests/ui-posix/conf_bad_toml.stderr b/tests/ui-posix/conf_bad_toml.stderr index 7920bd35589..a56cfea266c 100644 --- a/tests/ui-posix/conf_bad_toml.stderr +++ b/tests/ui-posix/conf_bad_toml.stderr @@ -1,4 +1,4 @@ -error: error reading Clippy's configuration file: No such file or directory (os error 2) +error: error reading Clippy's configuration file: expected `=`, but found `t` error: aborting due to previous error diff --git a/tests/ui-posix/conf_bad_type.rs b/tests/ui-posix/conf_bad_type.rs index 8dc3e4ec2e6..d77d304306a 100644 --- a/tests/ui-posix/conf_bad_type.rs +++ b/tests/ui-posix/conf_bad_type.rs @@ -1,6 +1,6 @@ // error-pattern: error reading Clippy's configuration file: `blacklisted-names` is expected to be a `Vec < String >` but is a `integer` #![feature(plugin)] -#![plugin(clippy(conf_file="./tests/compile-fail/conf_bad_type.toml"))] +#![plugin(clippy(conf_file="./tests/ui-posix/conf_bad_type.toml"))] fn main() {} diff --git a/tests/ui-posix/conf_bad_type.stderr b/tests/ui-posix/conf_bad_type.stderr index 7920bd35589..015d9ca2a3a 100644 --- a/tests/ui-posix/conf_bad_type.stderr +++ b/tests/ui-posix/conf_bad_type.stderr @@ -1,4 +1,4 @@ -error: error reading Clippy's configuration file: No such file or directory (os error 2) +error: error reading Clippy's configuration file: `blacklisted-names` is expected to be a `Vec < String >` but is a `integer` error: aborting due to previous error From 25e230419c642e925f168e473f6bec7c34bdf252 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Tue, 21 Feb 2017 12:19:55 +0100 Subject: [PATCH 6/6] Merge system independent ui-tests back into tests/ui --- tests/ui-windows/conf_bad_toml.rs | 6 ------ tests/ui-windows/conf_bad_toml.stderr | 4 ---- tests/ui-windows/conf_bad_toml.toml | 2 -- tests/ui-windows/conf_bad_type.rs | 6 ------ tests/ui-windows/conf_bad_type.stderr | 4 ---- tests/ui-windows/conf_bad_type.toml | 1 - tests/{ui-posix => ui}/conf_bad_toml.rs | 2 +- tests/{ui-posix => ui}/conf_bad_toml.stderr | 0 tests/{ui-posix => ui}/conf_bad_toml.toml | 0 tests/{ui-posix => ui}/conf_bad_type.rs | 2 +- tests/{ui-posix => ui}/conf_bad_type.stderr | 0 tests/{ui-posix => ui}/conf_bad_type.toml | 0 12 files changed, 2 insertions(+), 25 deletions(-) delete mode 100644 tests/ui-windows/conf_bad_toml.rs delete mode 100644 tests/ui-windows/conf_bad_toml.stderr delete mode 100644 tests/ui-windows/conf_bad_toml.toml delete mode 100644 tests/ui-windows/conf_bad_type.rs delete mode 100644 tests/ui-windows/conf_bad_type.stderr delete mode 100644 tests/ui-windows/conf_bad_type.toml rename tests/{ui-posix => ui}/conf_bad_toml.rs (58%) rename tests/{ui-posix => ui}/conf_bad_toml.stderr (100%) rename tests/{ui-posix => ui}/conf_bad_toml.toml (100%) rename tests/{ui-posix => ui}/conf_bad_type.rs (71%) rename tests/{ui-posix => ui}/conf_bad_type.stderr (100%) rename tests/{ui-posix => ui}/conf_bad_type.toml (100%) diff --git a/tests/ui-windows/conf_bad_toml.rs b/tests/ui-windows/conf_bad_toml.rs deleted file mode 100644 index 69ce68c25df..00000000000 --- a/tests/ui-windows/conf_bad_toml.rs +++ /dev/null @@ -1,6 +0,0 @@ -// error-pattern: error reading Clippy's configuration file - -#![feature(plugin)] -#![plugin(clippy(conf_file="./tests/ui-windows/conf_bad_toml.toml"))] - -fn main() {} diff --git a/tests/ui-windows/conf_bad_toml.stderr b/tests/ui-windows/conf_bad_toml.stderr deleted file mode 100644 index f21ae524f5e..00000000000 --- a/tests/ui-windows/conf_bad_toml.stderr +++ /dev/null @@ -1,4 +0,0 @@ -error: error reading Clippy's configuration file: The system cannot find the file specified. (os error 2) - -error: aborting due to previous error - diff --git a/tests/ui-windows/conf_bad_toml.toml b/tests/ui-windows/conf_bad_toml.toml deleted file mode 100644 index 823e01a33b9..00000000000 --- a/tests/ui-windows/conf_bad_toml.toml +++ /dev/null @@ -1,2 +0,0 @@ -fn this_is_obviously(not: a, toml: file) { -} diff --git a/tests/ui-windows/conf_bad_type.rs b/tests/ui-windows/conf_bad_type.rs deleted file mode 100644 index eaaac0ea86d..00000000000 --- a/tests/ui-windows/conf_bad_type.rs +++ /dev/null @@ -1,6 +0,0 @@ -// error-pattern: error reading Clippy's configuration file: `blacklisted-names` is expected to be a `Vec < String >` but is a `integer` - -#![feature(plugin)] -#![plugin(clippy(conf_file="./tests/ui-windows/conf_bad_type.toml"))] - -fn main() {} diff --git a/tests/ui-windows/conf_bad_type.stderr b/tests/ui-windows/conf_bad_type.stderr deleted file mode 100644 index f21ae524f5e..00000000000 --- a/tests/ui-windows/conf_bad_type.stderr +++ /dev/null @@ -1,4 +0,0 @@ -error: error reading Clippy's configuration file: The system cannot find the file specified. (os error 2) - -error: aborting due to previous error - diff --git a/tests/ui-windows/conf_bad_type.toml b/tests/ui-windows/conf_bad_type.toml deleted file mode 100644 index 168675394d7..00000000000 --- a/tests/ui-windows/conf_bad_type.toml +++ /dev/null @@ -1 +0,0 @@ -blacklisted-names = 42 diff --git a/tests/ui-posix/conf_bad_toml.rs b/tests/ui/conf_bad_toml.rs similarity index 58% rename from tests/ui-posix/conf_bad_toml.rs rename to tests/ui/conf_bad_toml.rs index d80a9c8edeb..22cbfca759e 100644 --- a/tests/ui-posix/conf_bad_toml.rs +++ b/tests/ui/conf_bad_toml.rs @@ -1,6 +1,6 @@ // error-pattern: error reading Clippy's configuration file #![feature(plugin)] -#![plugin(clippy(conf_file="./tests/ui-posix/conf_bad_toml.toml"))] +#![plugin(clippy(conf_file="./tests/ui/conf_bad_toml.toml"))] fn main() {} diff --git a/tests/ui-posix/conf_bad_toml.stderr b/tests/ui/conf_bad_toml.stderr similarity index 100% rename from tests/ui-posix/conf_bad_toml.stderr rename to tests/ui/conf_bad_toml.stderr diff --git a/tests/ui-posix/conf_bad_toml.toml b/tests/ui/conf_bad_toml.toml similarity index 100% rename from tests/ui-posix/conf_bad_toml.toml rename to tests/ui/conf_bad_toml.toml diff --git a/tests/ui-posix/conf_bad_type.rs b/tests/ui/conf_bad_type.rs similarity index 71% rename from tests/ui-posix/conf_bad_type.rs rename to tests/ui/conf_bad_type.rs index d77d304306a..d5cca60a301 100644 --- a/tests/ui-posix/conf_bad_type.rs +++ b/tests/ui/conf_bad_type.rs @@ -1,6 +1,6 @@ // error-pattern: error reading Clippy's configuration file: `blacklisted-names` is expected to be a `Vec < String >` but is a `integer` #![feature(plugin)] -#![plugin(clippy(conf_file="./tests/ui-posix/conf_bad_type.toml"))] +#![plugin(clippy(conf_file="./tests/ui/conf_bad_type.toml"))] fn main() {} diff --git a/tests/ui-posix/conf_bad_type.stderr b/tests/ui/conf_bad_type.stderr similarity index 100% rename from tests/ui-posix/conf_bad_type.stderr rename to tests/ui/conf_bad_type.stderr diff --git a/tests/ui-posix/conf_bad_type.toml b/tests/ui/conf_bad_type.toml similarity index 100% rename from tests/ui-posix/conf_bad_type.toml rename to tests/ui/conf_bad_type.toml