Skip to content

Commit 4f47342

Browse files
committed
Add regression tests
1 parent ff5b2a4 commit 4f47342

4 files changed

+88
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
error[E0283]: type annotations needed
2+
--> $DIR/auto-trait-selection-freeze.rs:20:16
3+
|
4+
LL | if false { is_trait(foo()) } else { Default::default() }
5+
| ^^^^^^^^ ----- type must be known at this point
6+
| |
7+
| cannot infer type of the type parameter `T` declared on the function `is_trait`
8+
|
9+
= note: cannot satisfy `_: Trait<_>`
10+
note: required by a bound in `is_trait`
11+
--> $DIR/auto-trait-selection-freeze.rs:12:16
12+
|
13+
LL | fn is_trait<T: Trait<U>, U: Default>(_: T) -> U {
14+
| ^^^^^^^^ required by this bound in `is_trait`
15+
help: consider specifying the generic arguments
16+
|
17+
LL | if false { is_trait::<T, U>(foo()) } else { Default::default() }
18+
| ++++++++
19+
20+
error: aborting due to 1 previous error
21+
22+
For more information about this error, try `rustc --explain E0283`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//! This test shows how we fail selection in a way that can influence
2+
//! selection in a code path that succeeds.
3+
4+
//@ revisions: next old
5+
//@[next] compile-flags: -Znext-solver
6+
//@[old]check-pass
7+
8+
#![feature(freeze)]
9+
10+
use std::marker::Freeze;
11+
12+
fn is_trait<T: Trait<U>, U: Default>(_: T) -> U {
13+
Default::default()
14+
}
15+
16+
trait Trait<T> {}
17+
impl<T: Freeze> Trait<u32> for T {}
18+
impl<T> Trait<i32> for T {}
19+
fn foo() -> impl Sized {
20+
if false { is_trait(foo()) } else { Default::default() }
21+
//[next]~^ ERROR: type annotations needed
22+
}
23+
24+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
error[E0283]: type annotations needed
2+
--> $DIR/auto-trait-selection.rs:16:16
3+
|
4+
LL | if false { is_trait(foo()) } else { Default::default() }
5+
| ^^^^^^^^ ----- type must be known at this point
6+
| |
7+
| cannot infer type of the type parameter `T` declared on the function `is_trait`
8+
|
9+
= note: cannot satisfy `_: Trait<_>`
10+
note: required by a bound in `is_trait`
11+
--> $DIR/auto-trait-selection.rs:8:16
12+
|
13+
LL | fn is_trait<T: Trait<U>, U: Default>(_: T) -> U {
14+
| ^^^^^^^^ required by this bound in `is_trait`
15+
help: consider specifying the generic arguments
16+
|
17+
LL | if false { is_trait::<T, U>(foo()) } else { Default::default() }
18+
| ++++++++
19+
20+
error: aborting due to 1 previous error
21+
22+
For more information about this error, try `rustc --explain E0283`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//! This test shows how we fail selection in a way that can influence
2+
//! selection in a code path that succeeds.
3+
4+
//@ revisions: next old
5+
//@[next] compile-flags: -Znext-solver
6+
//@[old]check-pass
7+
8+
fn is_trait<T: Trait<U>, U: Default>(_: T) -> U {
9+
Default::default()
10+
}
11+
12+
trait Trait<T> {}
13+
impl<T: Send> Trait<u32> for T {}
14+
impl<T> Trait<i32> for T {}
15+
fn foo() -> impl Sized {
16+
if false { is_trait(foo()) } else { Default::default() }
17+
//[next]~^ ERROR: type annotations needed
18+
}
19+
20+
fn main() {}

0 commit comments

Comments
 (0)