Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add tests for several E-needstest issues #58743

Merged
merged 17 commits into from
Mar 13, 2019
10 changes: 10 additions & 0 deletions src/test/ui/block-expression-remove-semicolon.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
fn foo() -> i32 {
0
}

fn main() {
let x: i32 = {
//~^ ERROR mismatched types
foo(); //~ HELP consider removing this semicolon
};
}
17 changes: 17 additions & 0 deletions src/test/ui/block-expression-remove-semicolon.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
error[E0308]: mismatched types
--> $DIR/block-expression-remove-semicolon.rs:6:18
|
LL | let x: i32 = {
| __________________^
LL | |
LL | | foo();
| | - help: consider removing this semicolon
LL | | };
| |_____^ expected i32, found ()
|
= note: expected type `i32`
found type `()`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
19 changes: 19 additions & 0 deletions src/test/ui/borrowck/issue-10876.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// run-pass

#![feature(nll)]

enum Nat {
S(Box<Nat>),
Z
}
fn test(x: &mut Nat) {
let mut p = &mut *x;
loop {
match p {
&mut Nat::Z => break,
&mut Nat::S(ref mut n) => p = &mut *n
}
}
}

fn main() {}
13 changes: 13 additions & 0 deletions src/test/ui/issues/issue-26448-1.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// run-pass

pub trait Foo<T> {
fn foo(self) -> T;
}

impl<'a, T> Foo<T> for &'a str where &'a str: Into<T> {
fn foo(self) -> T {
panic!();
}
}

fn main() {}
21 changes: 21 additions & 0 deletions src/test/ui/issues/issue-26448-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// run-pass

pub struct Bar<T> {
items: Vec<&'static str>,
inner: T,
}

pub trait IntoBar<T> {
fn into_bar(self) -> Bar<T>;
}

impl<'a, T> IntoBar<T> for &'a str where &'a str: Into<T> {
fn into_bar(self) -> Bar<T> {
Bar {
items: Vec::new(),
inner: self.into(),
}
}
}

fn main() {}
25 changes: 25 additions & 0 deletions src/test/ui/issues/issue-26448-3.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// run-pass

pub struct Item {
_inner: &'static str,
}

pub struct Bar<T> {
items: Vec<Item>,
inner: T,
}

pub trait IntoBar<T> {
fn into_bar(self) -> Bar<T>;
}

impl<'a, T> IntoBar<T> for &'a str where &'a str: Into<T> {
fn into_bar(self) -> Bar<T> {
Bar {
items: Vec::new(),
inner: self.into(),
}
}
}

fn main() {}
11 changes: 11 additions & 0 deletions src/test/ui/issues/issue-26619.nll.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error[E0515]: cannot return value referencing function parameter
--> $DIR/issue-26619.rs:7:76
|
LL | for s in vec!["1|2".to_string()].into_iter().filter_map(|ref line| self.make_entry(line)) {
| -------- ^^^^^^^^^^^^^^^^^^^^^ returns a value referencing data owned by the current function
| |
| function parameter borrowed here

error: aborting due to previous error

For more information about this error, try `rustc --explain E0515`.
24 changes: 24 additions & 0 deletions src/test/ui/issues/issue-26619.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#![feature(slice_patterns)]

pub struct History<'a> { pub _s: &'a str }

impl<'a> History<'a> {
pub fn get_page(&self) {
for s in vec!["1|2".to_string()].into_iter().filter_map(|ref line| self.make_entry(line)) {
//~^ ERROR borrowed value does not live long enough
println!("{:?}", s);
}
}

fn make_entry(&self, s: &'a String) -> Option<&str> {
let parts: Vec<_> = s.split('|').collect();
println!("{:?} -> {:?}", s, parts);

if let [commit, ..] = &parts[..] { Some(commit) } else { None }
}
}

fn main() {
let h = History{ _s: "" };
h.get_page();
}
12 changes: 12 additions & 0 deletions src/test/ui/issues/issue-26619.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
error[E0597]: borrowed value does not live long enough
--> $DIR/issue-26619.rs:7:66
|
LL | for s in vec!["1|2".to_string()].into_iter().filter_map(|ref line| self.make_entry(line)) {
| ^^^^^^^^ -- temporary value needs to live until here
| | |
| | temporary value dropped here while still borrowed
| temporary value does not live long enough

error: aborting due to previous error

For more information about this error, try `rustc --explain E0597`.
17 changes: 17 additions & 0 deletions src/test/ui/issues/issue-44127.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// run-pass

#![feature(decl_macro)]

pub struct Foo {
bar: u32,
}
pub macro pattern($a:pat) {
Foo { bar: $a }
}

fn main() {
match (Foo { bar: 3 }) {
pattern!(3) => println!("Test OK"),
_ => unreachable!(),
}
}
29 changes: 29 additions & 0 deletions src/test/ui/issues/issue-44255.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// run-pass

use std::marker::PhantomData;

fn main() {
let _arr = [1; <Multiply<Five, Five>>::VAL];
}

trait TypeVal<T> {
const VAL: T;
}

struct Five;

impl TypeVal<usize> for Five {
const VAL: usize = 5;
}

struct Multiply<N, M> {
_n: PhantomData<N>,
_m: PhantomData<M>,
}

impl<N, M> TypeVal<usize> for Multiply<N, M>
where N: TypeVal<usize>,
M: TypeVal<usize>,
{
const VAL: usize = N::VAL * M::VAL;
}
4 changes: 4 additions & 0 deletions src/test/ui/issues/issue-46101.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#![feature(use_extern_macros)]
trait Foo {}
#[derive(Foo::Anything)] //~ ERROR failed to resolve: partially resolved path in a derive macro
struct S;
14 changes: 14 additions & 0 deletions src/test/ui/issues/issue-46101.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
error[E0433]: failed to resolve: partially resolved path in a derive macro
--> $DIR/issue-46101.rs:3:10
|
LL | #[derive(Foo::Anything)]
| ^^^^^^^^^^^^^ partially resolved path in a derive macro

error[E0601]: `main` function not found in crate `issue_46101`
|
= note: consider adding a `main` function to `$DIR/issue-46101.rs`

error: aborting due to 2 previous errors

Some errors occurred: E0433, E0601.
For more information about an error, try `rustc --explain E0433`.
52 changes: 52 additions & 0 deletions src/test/ui/issues/issue-55731.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
use std::marker::PhantomData;

trait DistributedIterator {
fn reduce(self)
where
Self: Sized,
{
unreachable!()
}
}

trait DistributedIteratorMulti<Source> {
type Item;
}

struct Connect<I>(PhantomData<fn(I)>);
impl<I: for<'a> DistributedIteratorMulti<&'a ()>> DistributedIterator for Connect<I> where {}

struct Cloned<Source>(PhantomData<fn(Source)>);
impl<'a, Source> DistributedIteratorMulti<&'a Source> for Cloned<&'a Source> {
type Item = ();
}

struct Map<I, F> {
i: I,
f: F,
}
impl<I: DistributedIteratorMulti<Source>, F, Source> DistributedIteratorMulti<Source> for Map<I, F>
where
F: A<<I as DistributedIteratorMulti<Source>>::Item>,
{
type Item = ();
}

trait A<B> {}

struct X;
impl A<()> for X {}

fn multi<I>(_reducer: I)
where
I: for<'a> DistributedIteratorMulti<&'a ()>,
{
DistributedIterator::reduce(Connect::<I>(PhantomData))
}

fn main() {
multi(Map { //~ ERROR implementation of `DistributedIteratorMulti` is not general enough
i: Cloned(PhantomData),
f: X,
});
}
11 changes: 11 additions & 0 deletions src/test/ui/issues/issue-55731.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
error: implementation of `DistributedIteratorMulti` is not general enough
--> $DIR/issue-55731.rs:48:5
|
LL | multi(Map {
| ^^^^^
|
= note: `DistributedIteratorMulti<&'0 ()>` would have to be implemented for the type `Cloned<&()>`, for any lifetime `'0`
= note: but `DistributedIteratorMulti<&'1 ()>` is actually implemented for the type `Cloned<&'1 ()>`, for some specific lifetime `'1`

error: aborting due to previous error

20 changes: 20 additions & 0 deletions src/test/ui/issues/issue-57781.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// run-pass

use std::cell::UnsafeCell;
use std::collections::HashMap;

struct OnceCell<T> {
_value: UnsafeCell<Option<T>>,
}

impl<T> OnceCell<T> {
const INIT: OnceCell<T> = OnceCell {
_value: UnsafeCell::new(None),
};
}

pub fn crash<K, T>() {
let _ = OnceCell::<HashMap<K, T>>::INIT;
}

fn main() {}
6 changes: 6 additions & 0 deletions src/test/ui/primitive-binop-lhs-mut.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// run-pass

fn main() {
let x = Box::new(0);
assert_eq!(0, *x + { drop(x); let _ = Box::new(main); 0 });
}