summaryrefslogtreecommitdiffstats
path: root/tests/ui/traits
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/traits')
-rw-r--r--tests/ui/traits/coercion-generic-bad.stderr2
-rw-r--r--tests/ui/traits/copy-guessing.rs4
-rw-r--r--tests/ui/traits/copy-guessing.stderr14
-rw-r--r--tests/ui/traits/cycle-cache-err-60010.stderr9
-rw-r--r--tests/ui/traits/impl-evaluation-order.rs2
-rw-r--r--tests/ui/traits/infer-from-object-issue-26952.rs4
-rw-r--r--tests/ui/traits/issue-106072.rs1
-rw-r--r--tests/ui/traits/issue-106072.stderr12
-rw-r--r--tests/ui/traits/issue-20692.stderr3
-rw-r--r--tests/ui/traits/issue-22384.rs8
-rw-r--r--tests/ui/traits/issue-22384.stderr9
-rw-r--r--tests/ui/traits/issue-38404.rs1
-rw-r--r--tests/ui/traits/issue-38404.stderr16
-rw-r--r--tests/ui/traits/issue-38604.stderr3
-rw-r--r--tests/ui/traits/issue-7013.stderr5
-rw-r--r--tests/ui/traits/map-types.stderr2
-rw-r--r--tests/ui/traits/negative-bounds/associated-constraints.rs20
-rw-r--r--tests/ui/traits/negative-bounds/associated-constraints.stderr34
-rw-r--r--tests/ui/traits/negative-bounds/simple.rs42
-rw-r--r--tests/ui/traits/negative-bounds/simple.stderr70
-rw-r--r--tests/ui/traits/negative-bounds/supertrait.rs9
-rw-r--r--tests/ui/traits/negative-bounds/supertrait.stderr10
-rw-r--r--tests/ui/traits/negative-impls/negated-auto-traits-error.stderr6
-rw-r--r--tests/ui/traits/new-solver/alias-bound-unsound.rs27
-rw-r--r--tests/ui/traits/new-solver/alias-bound-unsound.stderr24
-rw-r--r--tests/ui/traits/new-solver/alias_eq_dont_use_normalizes_to_if_substs_eq.rs4
-rw-r--r--tests/ui/traits/new-solver/alias_eq_dont_use_normalizes_to_if_substs_eq.stderr9
-rw-r--r--tests/ui/traits/new-solver/alias_eq_substs_eq_not_intercrate.rs4
-rw-r--r--tests/ui/traits/new-solver/alias_eq_substs_eq_not_intercrate.stderr9
-rw-r--r--tests/ui/traits/new-solver/auto-with-drop_tracking_mir.fail.stderr4
-rw-r--r--tests/ui/traits/new-solver/auto-with-drop_tracking_mir.rs1
-rw-r--r--tests/ui/traits/new-solver/borrowck-error.rs11
-rw-r--r--tests/ui/traits/new-solver/borrowck-error.stderr12
-rw-r--r--tests/ui/traits/new-solver/exponential-trait-goals.rs20
-rw-r--r--tests/ui/traits/new-solver/exponential-trait-goals.stderr23
-rw-r--r--tests/ui/traits/new-solver/int-var-alias-eq.rs2
-rw-r--r--tests/ui/traits/new-solver/negative-coherence-bounds.rs40
-rw-r--r--tests/ui/traits/new-solver/negative-coherence-bounds.stderr12
-rw-r--r--tests/ui/traits/new-solver/nested-alias-bound.rs20
-rw-r--r--tests/ui/traits/new-solver/normalize-rcvr-for-inherent.rs25
-rw-r--r--tests/ui/traits/new-solver/structural-resolve-field.rs13
-rw-r--r--tests/ui/traits/new-solver/temporary-ambiguity.rs2
-rw-r--r--tests/ui/traits/new-solver/two-projection-param-candidates-are-ambiguous.rs2
-rw-r--r--tests/ui/traits/non_lifetime_binders/drop-impl-pred.no.stderr24
-rw-r--r--tests/ui/traits/non_lifetime_binders/drop-impl-pred.rs25
-rw-r--r--tests/ui/traits/non_lifetime_binders/drop-impl-pred.yes.stderr11
-rw-r--r--tests/ui/traits/non_lifetime_binders/supertrait-object-safety.stderr3
-rw-r--r--tests/ui/traits/non_lifetime_binders/universe-error1.rs18
-rw-r--r--tests/ui/traits/non_lifetime_binders/universe-error1.stderr27
-rw-r--r--tests/ui/traits/object/safety.stderr3
-rw-r--r--tests/ui/traits/test-2.stderr3
-rw-r--r--tests/ui/traits/trait-upcasting/type-checking-test-1.stderr2
-rw-r--r--tests/ui/traits/trait-upcasting/type-checking-test-2.stderr4
-rw-r--r--tests/ui/traits/unsend-future.stderr4
54 files changed, 610 insertions, 64 deletions
diff --git a/tests/ui/traits/coercion-generic-bad.stderr b/tests/ui/traits/coercion-generic-bad.stderr
index 93d6770eb..e7e8a7967 100644
--- a/tests/ui/traits/coercion-generic-bad.stderr
+++ b/tests/ui/traits/coercion-generic-bad.stderr
@@ -5,7 +5,7 @@ LL | let s: Box<dyn Trait<isize>> = Box::new(Struct { person: "Fred" });
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait<isize>` is not implemented for `Struct`
|
= help: the trait `Trait<&'static str>` is implemented for `Struct`
- = note: required for the cast from `Struct` to the object type `dyn Trait<isize>`
+ = note: required for the cast from `Box<Struct>` to `Box<dyn Trait<isize>>`
error: aborting due to previous error
diff --git a/tests/ui/traits/copy-guessing.rs b/tests/ui/traits/copy-guessing.rs
index f031dd9ca..af25010e3 100644
--- a/tests/ui/traits/copy-guessing.rs
+++ b/tests/ui/traits/copy-guessing.rs
@@ -1,5 +1,6 @@
-// run-pass
#![allow(dead_code)]
+#![allow(dropping_copy_types)]
+
// "guessing" in trait selection can affect `copy_or_move`. Check that this
// is correctly handled. I am not sure what is the "correct" behaviour,
// but we should at least not ICE.
@@ -17,6 +18,7 @@ fn assert_impls_fn<R,T: Fn()->R>(_: &T){}
fn main() {
let n = None;
+ //~^ ERROR type annotations needed for `Option<T>`
let e = S(&n);
let f = || {
// S being copy is critical for this to work
diff --git a/tests/ui/traits/copy-guessing.stderr b/tests/ui/traits/copy-guessing.stderr
new file mode 100644
index 000000000..568b7e5a6
--- /dev/null
+++ b/tests/ui/traits/copy-guessing.stderr
@@ -0,0 +1,14 @@
+error[E0282]: type annotations needed for `Option<T>`
+ --> $DIR/copy-guessing.rs:20:9
+ |
+LL | let n = None;
+ | ^
+ |
+help: consider giving `n` an explicit type, where the type for type parameter `T` is specified
+ |
+LL | let n: Option<T> = None;
+ | +++++++++++
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0282`.
diff --git a/tests/ui/traits/cycle-cache-err-60010.stderr b/tests/ui/traits/cycle-cache-err-60010.stderr
index eeee99760..aee41c43a 100644
--- a/tests/ui/traits/cycle-cache-err-60010.stderr
+++ b/tests/ui/traits/cycle-cache-err-60010.stderr
@@ -4,9 +4,12 @@ error[E0275]: overflow evaluating the requirement `SalsaStorage: RefUnwindSafe`
LL | _parse: <ParseQuery as Query<RootDatabase>>::Data,
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
- = note: required because it appears within the type `PhantomData<SalsaStorage>`
- = note: required because it appears within the type `Unique<SalsaStorage>`
- = note: required because it appears within the type `Box<SalsaStorage>`
+note: required because it appears within the type `PhantomData<SalsaStorage>`
+ --> $SRC_DIR/core/src/marker.rs:LL:COL
+note: required because it appears within the type `Unique<SalsaStorage>`
+ --> $SRC_DIR/core/src/ptr/unique.rs:LL:COL
+note: required because it appears within the type `Box<SalsaStorage>`
+ --> $SRC_DIR/alloc/src/boxed.rs:LL:COL
note: required because it appears within the type `Runtime<RootDatabase>`
--> $DIR/cycle-cache-err-60010.rs:23:8
|
diff --git a/tests/ui/traits/impl-evaluation-order.rs b/tests/ui/traits/impl-evaluation-order.rs
index 57809d89a..2ce0b6b0d 100644
--- a/tests/ui/traits/impl-evaluation-order.rs
+++ b/tests/ui/traits/impl-evaluation-order.rs
@@ -6,6 +6,8 @@
// check-pass
+#![allow(dropping_copy_types)]
+
trait A {
type B;
}
diff --git a/tests/ui/traits/infer-from-object-issue-26952.rs b/tests/ui/traits/infer-from-object-issue-26952.rs
index ed258dbb2..9544b4f20 100644
--- a/tests/ui/traits/infer-from-object-issue-26952.rs
+++ b/tests/ui/traits/infer-from-object-issue-26952.rs
@@ -1,8 +1,8 @@
// run-pass
#![allow(dead_code)]
#![allow(unused_variables)]
-// Test that when we match a trait reference like `Foo<A>: Foo<_#0t>`,
-// we unify with `_#0t` with `A`. In this code, if we failed to do
+// Test that when we match a trait reference like `Foo<A>: Foo<?0t>`,
+// we unify with `?0t` with `A`. In this code, if we failed to do
// that, then you get an unconstrained type-variable in `call`.
//
// Also serves as a regression test for issue #26952, though the test
diff --git a/tests/ui/traits/issue-106072.rs b/tests/ui/traits/issue-106072.rs
index 7064a39d2..b17466954 100644
--- a/tests/ui/traits/issue-106072.rs
+++ b/tests/ui/traits/issue-106072.rs
@@ -1,5 +1,4 @@
#[derive(Clone)] //~ trait objects must include the `dyn` keyword
- //~| trait objects must include the `dyn` keyword
struct Foo;
trait Foo {} //~ the name `Foo` is defined multiple times
fn main() {}
diff --git a/tests/ui/traits/issue-106072.stderr b/tests/ui/traits/issue-106072.stderr
index f9b7b8146..1037603ce 100644
--- a/tests/ui/traits/issue-106072.stderr
+++ b/tests/ui/traits/issue-106072.stderr
@@ -1,5 +1,5 @@
error[E0428]: the name `Foo` is defined multiple times
- --> $DIR/issue-106072.rs:4:1
+ --> $DIR/issue-106072.rs:3:1
|
LL | struct Foo;
| ----------- previous definition of the type `Foo` here
@@ -16,15 +16,7 @@ LL | #[derive(Clone)]
|
= note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
-error[E0782]: trait objects must include the `dyn` keyword
- --> $DIR/issue-106072.rs:1:10
- |
-LL | #[derive(Clone)]
- | ^^^^^
- |
- = note: this error originates in the derive macro `Clone` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: aborting due to 3 previous errors
+error: aborting due to 2 previous errors
Some errors have detailed explanations: E0428, E0782.
For more information about an error, try `rustc --explain E0428`.
diff --git a/tests/ui/traits/issue-20692.stderr b/tests/ui/traits/issue-20692.stderr
index 2028994cd..30e3c9da1 100644
--- a/tests/ui/traits/issue-20692.stderr
+++ b/tests/ui/traits/issue-20692.stderr
@@ -27,8 +27,7 @@ LL | trait Array: Sized + Copy {}
| | |
| | ...because it requires `Self: Sized`
| this trait cannot be made into an object...
- = note: required for `&T` to implement `CoerceUnsized<&dyn Array>`
- = note: required by cast to type `&dyn Array`
+ = note: required for the cast from `&T` to `&dyn Array`
error: aborting due to 2 previous errors
diff --git a/tests/ui/traits/issue-22384.rs b/tests/ui/traits/issue-22384.rs
new file mode 100644
index 000000000..98988f27e
--- /dev/null
+++ b/tests/ui/traits/issue-22384.rs
@@ -0,0 +1,8 @@
+trait Trait {
+ fn foo();
+}
+
+fn main() {
+ <<i32 as Copy>::foobar as Trait>::foo();
+ //~^ ERROR cannot find associated type `foobar` in trait `Copy`
+}
diff --git a/tests/ui/traits/issue-22384.stderr b/tests/ui/traits/issue-22384.stderr
new file mode 100644
index 000000000..1f767a443
--- /dev/null
+++ b/tests/ui/traits/issue-22384.stderr
@@ -0,0 +1,9 @@
+error[E0576]: cannot find associated type `foobar` in trait `Copy`
+ --> $DIR/issue-22384.rs:6:21
+ |
+LL | <<i32 as Copy>::foobar as Trait>::foo();
+ | ^^^^^^ not found in `Copy`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0576`.
diff --git a/tests/ui/traits/issue-38404.rs b/tests/ui/traits/issue-38404.rs
index 1a92acc34..05921b2c3 100644
--- a/tests/ui/traits/issue-38404.rs
+++ b/tests/ui/traits/issue-38404.rs
@@ -2,5 +2,6 @@ trait A<T>: std::ops::Add<Self> + Sized {}
trait B<T>: A<T> {}
trait C<T>: A<dyn B<T, Output=usize>> {}
//~^ ERROR the trait `B` cannot be made into an object
+//~| ERROR the trait `B` cannot be made into an object
fn main() {}
diff --git a/tests/ui/traits/issue-38404.stderr b/tests/ui/traits/issue-38404.stderr
index d7721d7e6..f8625f53b 100644
--- a/tests/ui/traits/issue-38404.stderr
+++ b/tests/ui/traits/issue-38404.stderr
@@ -12,6 +12,20 @@ LL | trait A<T>: std::ops::Add<Self> + Sized {}
LL | trait B<T>: A<T> {}
| - this trait cannot be made into an object...
-error: aborting due to previous error
+error[E0038]: the trait `B` cannot be made into an object
+ --> $DIR/issue-38404.rs:3:15
+ |
+LL | trait C<T>: A<dyn B<T, Output=usize>> {}
+ | ^^^^^^^^^^^^^^^^^^^^^^ `B` cannot be made into an object
+ |
+note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
+ --> $DIR/issue-38404.rs:1:13
+ |
+LL | trait A<T>: std::ops::Add<Self> + Sized {}
+ | ^^^^^^^^^^^^^^^^^^^ ...because it uses `Self` as a type parameter
+LL | trait B<T>: A<T> {}
+ | - this trait cannot be made into an object...
+
+error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0038`.
diff --git a/tests/ui/traits/issue-38604.stderr b/tests/ui/traits/issue-38604.stderr
index 50d6fb054..d53276024 100644
--- a/tests/ui/traits/issue-38604.stderr
+++ b/tests/ui/traits/issue-38604.stderr
@@ -25,8 +25,7 @@ LL | trait Foo where u32: Q<Self> {
| --- ^^^^^^^ ...because it uses `Self` as a type parameter
| |
| this trait cannot be made into an object...
- = note: required for `Box<()>` to implement `CoerceUnsized<Box<dyn Foo>>`
- = note: required by cast to type `Box<dyn Foo>`
+ = note: required for the cast from `Box<()>` to `Box<dyn Foo>`
error: aborting due to 2 previous errors
diff --git a/tests/ui/traits/issue-7013.stderr b/tests/ui/traits/issue-7013.stderr
index 4575f4dba..1c0e8bcf1 100644
--- a/tests/ui/traits/issue-7013.stderr
+++ b/tests/ui/traits/issue-7013.stderr
@@ -5,13 +5,14 @@ LL | let a = A {v: Box::new(B{v: None}) as Box<dyn Foo + Send>};
| ^^^^^^^^^^^^^^^^^^^^ `Rc<RefCell<A>>` cannot be sent between threads safely
|
= help: within `B`, the trait `Send` is not implemented for `Rc<RefCell<A>>`
- = note: required because it appears within the type `Option<Rc<RefCell<A>>>`
+note: required because it appears within the type `Option<Rc<RefCell<A>>>`
+ --> $SRC_DIR/core/src/option.rs:LL:COL
note: required because it appears within the type `B`
--> $DIR/issue-7013.rs:8:8
|
LL | struct B {
| ^
- = note: required for the cast from `B` to the object type `dyn Foo + Send`
+ = note: required for the cast from `Box<B>` to `Box<dyn Foo + Send>`
error: aborting due to previous error
diff --git a/tests/ui/traits/map-types.stderr b/tests/ui/traits/map-types.stderr
index f685c50b0..4315056f2 100644
--- a/tests/ui/traits/map-types.stderr
+++ b/tests/ui/traits/map-types.stderr
@@ -5,7 +5,7 @@ LL | let y: Box<dyn Map<usize, isize>> = Box::new(x);
| ^^^^^^^^^^^ the trait `Map<usize, isize>` is not implemented for `Box<dyn Map<isize, isize>>`
|
= help: the trait `Map<K, V>` is implemented for `HashMap<K, V>`
- = note: required for the cast from `Box<dyn Map<isize, isize>>` to the object type `dyn Map<usize, isize>`
+ = note: required for the cast from `Box<Box<dyn Map<isize, isize>>>` to `Box<dyn Map<usize, isize>>`
error: aborting due to previous error
diff --git a/tests/ui/traits/negative-bounds/associated-constraints.rs b/tests/ui/traits/negative-bounds/associated-constraints.rs
new file mode 100644
index 000000000..bc1a0ef17
--- /dev/null
+++ b/tests/ui/traits/negative-bounds/associated-constraints.rs
@@ -0,0 +1,20 @@
+#![feature(negative_bounds, associated_type_bounds)]
+//~^ WARN the feature `negative_bounds` is incomplete and may not be safe to use and/or cause compiler crashes
+
+trait Trait {
+ type Assoc;
+}
+
+fn test<T: !Trait<Assoc = i32>>() {}
+//~^ ERROR associated type constraints not allowed on negative bounds
+
+fn test2<T>() where T: !Trait<Assoc = i32> {}
+//~^ ERROR associated type constraints not allowed on negative bounds
+
+fn test3<T: !Trait<Assoc: Send>>() {}
+//~^ ERROR associated type constraints not allowed on negative bounds
+
+fn test4<T>() where T: !Trait<Assoc: Send> {}
+//~^ ERROR associated type constraints not allowed on negative bounds
+
+fn main() {}
diff --git a/tests/ui/traits/negative-bounds/associated-constraints.stderr b/tests/ui/traits/negative-bounds/associated-constraints.stderr
new file mode 100644
index 000000000..335ac7e5a
--- /dev/null
+++ b/tests/ui/traits/negative-bounds/associated-constraints.stderr
@@ -0,0 +1,34 @@
+error: associated type constraints not allowed on negative bounds
+ --> $DIR/associated-constraints.rs:8:19
+ |
+LL | fn test<T: !Trait<Assoc = i32>>() {}
+ | ^^^^^^^^^^^
+
+error: associated type constraints not allowed on negative bounds
+ --> $DIR/associated-constraints.rs:11:31
+ |
+LL | fn test2<T>() where T: !Trait<Assoc = i32> {}
+ | ^^^^^^^^^^^
+
+error: associated type constraints not allowed on negative bounds
+ --> $DIR/associated-constraints.rs:14:20
+ |
+LL | fn test3<T: !Trait<Assoc: Send>>() {}
+ | ^^^^^^^^^^^
+
+error: associated type constraints not allowed on negative bounds
+ --> $DIR/associated-constraints.rs:17:31
+ |
+LL | fn test4<T>() where T: !Trait<Assoc: Send> {}
+ | ^^^^^^^^^^^
+
+warning: the feature `negative_bounds` is incomplete and may not be safe to use and/or cause compiler crashes
+ --> $DIR/associated-constraints.rs:1:12
+ |
+LL | #![feature(negative_bounds, associated_type_bounds)]
+ | ^^^^^^^^^^^^^^^
+ |
+ = note: `#[warn(incomplete_features)]` on by default
+
+error: aborting due to 4 previous errors; 1 warning emitted
+
diff --git a/tests/ui/traits/negative-bounds/simple.rs b/tests/ui/traits/negative-bounds/simple.rs
new file mode 100644
index 000000000..f6d1d5169
--- /dev/null
+++ b/tests/ui/traits/negative-bounds/simple.rs
@@ -0,0 +1,42 @@
+#![feature(negative_bounds, negative_impls)]
+//~^ WARN the feature `negative_bounds` is incomplete and may not be safe to use and/or cause compiler crashes
+
+fn not_copy<T: !Copy>() {}
+
+fn neg_param_env<T: !Copy>() {
+ not_copy::<T>();
+}
+
+fn pos_param_env<T: Copy>() {
+ not_copy::<T>();
+ //~^ ERROR the trait bound `T: !Copy` is not satisfied
+}
+
+fn unknown<T>() {
+ not_copy::<T>();
+ //~^ ERROR the trait bound `T: !Copy` is not satisfied
+}
+
+struct NotCopyable;
+impl !Copy for NotCopyable {}
+
+fn neg_impl() {
+ not_copy::<NotCopyable>();
+}
+
+#[derive(Copy, Clone)]
+struct Copyable;
+
+fn pos_impl() {
+ not_copy::<Copyable>();
+ //~^ ERROR the trait bound `Copyable: !Copy` is not satisfied
+}
+
+struct NotNecessarilyCopyable;
+
+fn unknown_impl() {
+ not_copy::<NotNecessarilyCopyable>();
+ //~^ ERROR the trait bound `NotNecessarilyCopyable: !Copy` is not satisfied
+}
+
+fn main() {}
diff --git a/tests/ui/traits/negative-bounds/simple.stderr b/tests/ui/traits/negative-bounds/simple.stderr
new file mode 100644
index 000000000..a3cab41a2
--- /dev/null
+++ b/tests/ui/traits/negative-bounds/simple.stderr
@@ -0,0 +1,70 @@
+warning: the feature `negative_bounds` is incomplete and may not be safe to use and/or cause compiler crashes
+ --> $DIR/simple.rs:1:12
+ |
+LL | #![feature(negative_bounds, negative_impls)]
+ | ^^^^^^^^^^^^^^^
+ |
+ = note: `#[warn(incomplete_features)]` on by default
+
+error[E0277]: the trait bound `T: !Copy` is not satisfied
+ --> $DIR/simple.rs:11:16
+ |
+LL | not_copy::<T>();
+ | ^ the trait `!Copy` is not implemented for `T`
+ |
+note: required by a bound in `not_copy`
+ --> $DIR/simple.rs:4:16
+ |
+LL | fn not_copy<T: !Copy>() {}
+ | ^^^^^ required by this bound in `not_copy`
+
+error[E0277]: the trait bound `T: !Copy` is not satisfied
+ --> $DIR/simple.rs:16:16
+ |
+LL | not_copy::<T>();
+ | ^ the trait `!Copy` is not implemented for `T`
+ |
+note: required by a bound in `not_copy`
+ --> $DIR/simple.rs:4:16
+ |
+LL | fn not_copy<T: !Copy>() {}
+ | ^^^^^ required by this bound in `not_copy`
+
+error[E0277]: the trait bound `Copyable: !Copy` is not satisfied
+ --> $DIR/simple.rs:31:16
+ |
+LL | not_copy::<Copyable>();
+ | ^^^^^^^^ the trait `!Copy` is not implemented for `Copyable`
+ |
+ = help: the trait `Copy` is implemented for `Copyable`
+note: required by a bound in `not_copy`
+ --> $DIR/simple.rs:4:16
+ |
+LL | fn not_copy<T: !Copy>() {}
+ | ^^^^^ required by this bound in `not_copy`
+help: consider annotating `Copyable` with `#[derive(Copy)]`
+ |
+LL + #[derive(Copy)]
+LL | struct Copyable;
+ |
+
+error[E0277]: the trait bound `NotNecessarilyCopyable: !Copy` is not satisfied
+ --> $DIR/simple.rs:38:16
+ |
+LL | not_copy::<NotNecessarilyCopyable>();
+ | ^^^^^^^^^^^^^^^^^^^^^^ the trait `!Copy` is not implemented for `NotNecessarilyCopyable`
+ |
+note: required by a bound in `not_copy`
+ --> $DIR/simple.rs:4:16
+ |
+LL | fn not_copy<T: !Copy>() {}
+ | ^^^^^ required by this bound in `not_copy`
+help: consider annotating `NotNecessarilyCopyable` with `#[derive(Copy)]`
+ |
+LL + #[derive(Copy)]
+LL | struct NotNecessarilyCopyable;
+ |
+
+error: aborting due to 4 previous errors; 1 warning emitted
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/traits/negative-bounds/supertrait.rs b/tests/ui/traits/negative-bounds/supertrait.rs
new file mode 100644
index 000000000..df0884b8b
--- /dev/null
+++ b/tests/ui/traits/negative-bounds/supertrait.rs
@@ -0,0 +1,9 @@
+// check-pass
+
+#![feature(negative_bounds)]
+//~^ WARN the feature `negative_bounds` is incomplete
+
+trait A: !B {}
+trait B: !A {}
+
+fn main() {}
diff --git a/tests/ui/traits/negative-bounds/supertrait.stderr b/tests/ui/traits/negative-bounds/supertrait.stderr
new file mode 100644
index 000000000..f44753b62
--- /dev/null
+++ b/tests/ui/traits/negative-bounds/supertrait.stderr
@@ -0,0 +1,10 @@
+warning: the feature `negative_bounds` is incomplete and may not be safe to use and/or cause compiler crashes
+ --> $DIR/supertrait.rs:3:12
+ |
+LL | #![feature(negative_bounds)]
+ | ^^^^^^^^^^^^^^^
+ |
+ = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/traits/negative-impls/negated-auto-traits-error.stderr b/tests/ui/traits/negative-impls/negated-auto-traits-error.stderr
index b680ce7f9..a53879657 100644
--- a/tests/ui/traits/negative-impls/negated-auto-traits-error.stderr
+++ b/tests/ui/traits/negative-impls/negated-auto-traits-error.stderr
@@ -67,7 +67,8 @@ LL | is_send(Box::new(TestType));
|
= note: the trait bound `Unique<dummy2::TestType>: Send` is not satisfied
= note: required for `Unique<dummy2::TestType>` to implement `Send`
- = note: required because it appears within the type `Box<TestType>`
+note: required because it appears within the type `Box<TestType>`
+ --> $SRC_DIR/alloc/src/boxed.rs:LL:COL
note: required by a bound in `is_send`
--> $DIR/negated-auto-traits-error.rs:16:15
|
@@ -93,7 +94,8 @@ note: required because it appears within the type `Outer2<TestType>`
LL | struct Outer2<T>(T);
| ^^^^^^
= note: required for `Unique<Outer2<dummy3::TestType>>` to implement `Send`
- = note: required because it appears within the type `Box<Outer2<TestType>>`
+note: required because it appears within the type `Box<Outer2<TestType>>`
+ --> $SRC_DIR/alloc/src/boxed.rs:LL:COL
note: required by a bound in `is_send`
--> $DIR/negated-auto-traits-error.rs:16:15
|
diff --git a/tests/ui/traits/new-solver/alias-bound-unsound.rs b/tests/ui/traits/new-solver/alias-bound-unsound.rs
new file mode 100644
index 000000000..00294c708
--- /dev/null
+++ b/tests/ui/traits/new-solver/alias-bound-unsound.rs
@@ -0,0 +1,27 @@
+// compile-flags: -Ztrait-solver=next
+
+// Makes sure that alias bounds are not unsound!
+
+#![feature(trivial_bounds)]
+
+trait Foo {
+ type Item: Copy
+ where
+ <Self as Foo>::Item: Copy;
+
+ fn copy_me(x: &Self::Item) -> Self::Item {
+ *x
+ }
+}
+
+impl Foo for () {
+ type Item = String where String: Copy;
+}
+
+fn main() {
+ let x = String::from("hello, world");
+ drop(<() as Foo>::copy_me(&x));
+ //~^ ERROR `<() as Foo>::Item: Copy` is not satisfied
+ //~| ERROR `<() as Foo>::Item` is not well-formed
+ println!("{x}");
+}
diff --git a/tests/ui/traits/new-solver/alias-bound-unsound.stderr b/tests/ui/traits/new-solver/alias-bound-unsound.stderr
new file mode 100644
index 000000000..9a43d2a66
--- /dev/null
+++ b/tests/ui/traits/new-solver/alias-bound-unsound.stderr
@@ -0,0 +1,24 @@
+error[E0277]: the trait bound `<() as Foo>::Item: Copy` is not satisfied
+ --> $DIR/alias-bound-unsound.rs:23:10
+ |
+LL | drop(<() as Foo>::copy_me(&x));
+ | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `<() as Foo>::Item`
+ |
+note: required by a bound in `Foo::Item`
+ --> $DIR/alias-bound-unsound.rs:10:30
+ |
+LL | type Item: Copy
+ | ---- required by a bound in this associated type
+LL | where
+LL | <Self as Foo>::Item: Copy;
+ | ^^^^ required by this bound in `Foo::Item`
+
+error: the type `<() as Foo>::Item` is not well-formed
+ --> $DIR/alias-bound-unsound.rs:23:10
+ |
+LL | drop(<() as Foo>::copy_me(&x));
+ | ^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/traits/new-solver/alias_eq_dont_use_normalizes_to_if_substs_eq.rs b/tests/ui/traits/new-solver/alias_eq_dont_use_normalizes_to_if_substs_eq.rs
index 531203d9c..3c7fc7403 100644
--- a/tests/ui/traits/new-solver/alias_eq_dont_use_normalizes_to_if_substs_eq.rs
+++ b/tests/ui/traits/new-solver/alias_eq_dont_use_normalizes_to_if_substs_eq.rs
@@ -1,5 +1,8 @@
// compile-flags: -Ztrait-solver=next
+// check-pass
+// (should not pass, should be turned into a coherence-only test)
+
// check that when computing `alias-eq(<() as Foo<u16, T>>::Assoc, <() as Foo<?0, T>>::Assoc)`
// we do not infer `?0 = u8` via the `for<STOP> (): Foo<u8, STOP>` impl or `?0 = u16` by
// relating substs as either could be a valid solution.
@@ -36,7 +39,6 @@ where
{
// `<() as Foo<u16, STOP>>::Assoc == <() as Foo<_, STOP>>::Assoc`
let _: <() as Foo<u16, T>>::Assoc = output::<_, T>();
- //~^ error: type annotations needed
// let _: <() as Foo<u16, T>>::Assoc = output::<u8, T>(); // OK
// let _: <() as Foo<u16, T>>::Assoc = output::<u16, T>(); // OK
diff --git a/tests/ui/traits/new-solver/alias_eq_dont_use_normalizes_to_if_substs_eq.stderr b/tests/ui/traits/new-solver/alias_eq_dont_use_normalizes_to_if_substs_eq.stderr
deleted file mode 100644
index a6712332c..000000000
--- a/tests/ui/traits/new-solver/alias_eq_dont_use_normalizes_to_if_substs_eq.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0282]: type annotations needed
- --> $DIR/alias_eq_dont_use_normalizes_to_if_substs_eq.rs:38:41
- |
-LL | let _: <() as Foo<u16, T>>::Assoc = output::<_, T>();
- | ^^^^^^^^^^^^^^ cannot infer type of the type parameter `T` declared on the function `output`
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0282`.
diff --git a/tests/ui/traits/new-solver/alias_eq_substs_eq_not_intercrate.rs b/tests/ui/traits/new-solver/alias_eq_substs_eq_not_intercrate.rs
index d4cc380fa..b036411be 100644
--- a/tests/ui/traits/new-solver/alias_eq_substs_eq_not_intercrate.rs
+++ b/tests/ui/traits/new-solver/alias_eq_substs_eq_not_intercrate.rs
@@ -1,5 +1,8 @@
// compile-flags: -Ztrait-solver=next
+// check-pass
+// (should not pass, should be turned into a coherence-only test)
+
// check that a `alias-eq(<?0 as TraitB>::Assoc, <T as TraitB>::Assoc)` goal fails.
// FIXME(deferred_projection_equality): add a test that this is true during coherence
@@ -14,7 +17,6 @@ fn needs_a<T: TraitB>() -> T::Assoc {
fn bar<T: TraitB>() {
let _: <_ as TraitB>::Assoc = needs_a::<T>();
- //~^ error: type annotations needed
}
fn main() {}
diff --git a/tests/ui/traits/new-solver/alias_eq_substs_eq_not_intercrate.stderr b/tests/ui/traits/new-solver/alias_eq_substs_eq_not_intercrate.stderr
deleted file mode 100644
index d063d8fce..000000000
--- a/tests/ui/traits/new-solver/alias_eq_substs_eq_not_intercrate.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0282]: type annotations needed
- --> $DIR/alias_eq_substs_eq_not_intercrate.rs:16:12
- |
-LL | let _: <_ as TraitB>::Assoc = needs_a::<T>();
- | ^^^^^^^^^^^^^^^^^^^^ cannot infer type for associated type `<_ as TraitB>::Assoc`
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0282`.
diff --git a/tests/ui/traits/new-solver/auto-with-drop_tracking_mir.fail.stderr b/tests/ui/traits/new-solver/auto-with-drop_tracking_mir.fail.stderr
index 6a926534e..4aefdd6bb 100644
--- a/tests/ui/traits/new-solver/auto-with-drop_tracking_mir.fail.stderr
+++ b/tests/ui/traits/new-solver/auto-with-drop_tracking_mir.fail.stderr
@@ -1,5 +1,5 @@
error[E0277]: `impl Future<Output = ()>` cannot be sent between threads safely
- --> $DIR/auto-with-drop_tracking_mir.rs:24:13
+ --> $DIR/auto-with-drop_tracking_mir.rs:25:13
|
LL | is_send(foo());
| ------- ^^^^^ `impl Future<Output = ()>` cannot be sent between threads safely
@@ -8,7 +8,7 @@ LL | is_send(foo());
|
= help: the trait `Send` is not implemented for `impl Future<Output = ()>`
note: required by a bound in `is_send`
- --> $DIR/auto-with-drop_tracking_mir.rs:23:24
+ --> $DIR/auto-with-drop_tracking_mir.rs:24:24
|
LL | fn is_send(_: impl Send) {}
| ^^^^ required by this bound in `is_send`
diff --git a/tests/ui/traits/new-solver/auto-with-drop_tracking_mir.rs b/tests/ui/traits/new-solver/auto-with-drop_tracking_mir.rs
index a5db7c463..e311a4af2 100644
--- a/tests/ui/traits/new-solver/auto-with-drop_tracking_mir.rs
+++ b/tests/ui/traits/new-solver/auto-with-drop_tracking_mir.rs
@@ -14,6 +14,7 @@ async fn foo() {
#[cfg(fail)]
let x = &NotSync;
bar().await;
+ #[allow(dropping_references)]
drop(x);
}
diff --git a/tests/ui/traits/new-solver/borrowck-error.rs b/tests/ui/traits/new-solver/borrowck-error.rs
new file mode 100644
index 000000000..4787a2c7e
--- /dev/null
+++ b/tests/ui/traits/new-solver/borrowck-error.rs
@@ -0,0 +1,11 @@
+// compile-flags: -Ztrait-solver=next
+
+use std::collections::HashMap;
+
+fn foo() -> &'static HashMap<i32, i32>
+{
+ &HashMap::new()
+ //~^ ERROR cannot return reference to temporary value
+}
+
+fn main() {}
diff --git a/tests/ui/traits/new-solver/borrowck-error.stderr b/tests/ui/traits/new-solver/borrowck-error.stderr
new file mode 100644
index 000000000..a7d820174
--- /dev/null
+++ b/tests/ui/traits/new-solver/borrowck-error.stderr
@@ -0,0 +1,12 @@
+error[E0515]: cannot return reference to temporary value
+ --> $DIR/borrowck-error.rs:7:5
+ |
+LL | &HashMap::new()
+ | ^--------------
+ | ||
+ | |temporary value created here
+ | returns a reference to data owned by the current function
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0515`.
diff --git a/tests/ui/traits/new-solver/exponential-trait-goals.rs b/tests/ui/traits/new-solver/exponential-trait-goals.rs
new file mode 100644
index 000000000..b37f09ee1
--- /dev/null
+++ b/tests/ui/traits/new-solver/exponential-trait-goals.rs
@@ -0,0 +1,20 @@
+// compile-flags: -Ztrait-solver=next
+
+trait Trait {}
+
+struct W<T>(T);
+
+impl<T, U> Trait for W<(W<T>, W<U>)>
+where
+ W<T>: Trait,
+ W<U>: Trait,
+{
+}
+
+fn impls<T: Trait>() {}
+
+fn main() {
+ impls::<W<_>>();
+ //~^ ERROR type annotations needed
+ //~| ERROR overflow evaluating the requirement `W<_>: Trait`
+}
diff --git a/tests/ui/traits/new-solver/exponential-trait-goals.stderr b/tests/ui/traits/new-solver/exponential-trait-goals.stderr
new file mode 100644
index 000000000..28a99cbbc
--- /dev/null
+++ b/tests/ui/traits/new-solver/exponential-trait-goals.stderr
@@ -0,0 +1,23 @@
+error[E0282]: type annotations needed
+ --> $DIR/exponential-trait-goals.rs:17:5
+ |
+LL | impls::<W<_>>();
+ | ^^^^^^^^^^^^^ cannot infer type of the type parameter `T` declared on the function `impls`
+
+error[E0275]: overflow evaluating the requirement `W<_>: Trait`
+ --> $DIR/exponential-trait-goals.rs:17:5
+ |
+LL | impls::<W<_>>();
+ | ^^^^^^^^^^^^^
+ |
+ = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`exponential_trait_goals`)
+note: required by a bound in `impls`
+ --> $DIR/exponential-trait-goals.rs:14:13
+ |
+LL | fn impls<T: Trait>() {}
+ | ^^^^^ required by this bound in `impls`
+
+error: aborting due to 2 previous errors
+
+Some errors have detailed explanations: E0275, E0282.
+For more information about an error, try `rustc --explain E0275`.
diff --git a/tests/ui/traits/new-solver/int-var-alias-eq.rs b/tests/ui/traits/new-solver/int-var-alias-eq.rs
index 2da387db4..790197e2d 100644
--- a/tests/ui/traits/new-solver/int-var-alias-eq.rs
+++ b/tests/ui/traits/new-solver/int-var-alias-eq.rs
@@ -1,7 +1,7 @@
// check-pass
// compile-flags: -Ztrait-solver=next
-// HIR typeck ends up equating `<_#0i as Add>::Output == _#0i`.
+// HIR typeck ends up equating `<?0i as Add>::Output == ?0i`.
// Want to make sure that we emit an alias-eq goal for this,
// instead of treating it as a type error and bailing.
diff --git a/tests/ui/traits/new-solver/negative-coherence-bounds.rs b/tests/ui/traits/new-solver/negative-coherence-bounds.rs
new file mode 100644
index 000000000..5436b02c3
--- /dev/null
+++ b/tests/ui/traits/new-solver/negative-coherence-bounds.rs
@@ -0,0 +1,40 @@
+// check-pass
+
+// This test verifies that negative trait predicate cannot be satisfied from a
+// positive param-env candidate.
+
+// Negative coherence is one of the only places where we actually construct and
+// evaluate negative predicates. Specifically, when verifying whether the first
+// and second impls below overlap, we do not want to consider them disjoint,
+// otherwise the second impl would be missing an associated type `type Item`
+// which is provided by the first impl that it is specializing.
+
+#![feature(specialization)]
+//~^ WARN the feature `specialization` is incomplete
+#![feature(with_negative_coherence)]
+
+trait BoxIter {
+ type Item;
+
+ fn last(self) -> Option<Self::Item>;
+}
+
+impl<I: Iterator + ?Sized> BoxIter for Box<I> {
+ type Item = I::Item;
+
+ default fn last(self) -> Option<I::Item> {
+ todo!()
+ }
+}
+
+// When checking that this impl does/doesn't overlap the one above, we evaluate
+// a negative version of all of the where-clause predicates of the impl below.
+// For `I: !Iterator`, we should make sure that the param-env clause `I: Iterator`
+// from above doesn't satisfy this predicate.
+impl<I: Iterator> BoxIter for Box<I> {
+ fn last(self) -> Option<I::Item> {
+ (*self).last()
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/traits/new-solver/negative-coherence-bounds.stderr b/tests/ui/traits/new-solver/negative-coherence-bounds.stderr
new file mode 100644
index 000000000..4127f51f5
--- /dev/null
+++ b/tests/ui/traits/new-solver/negative-coherence-bounds.stderr
@@ -0,0 +1,12 @@
+warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
+ --> $DIR/negative-coherence-bounds.rs:12:12
+ |
+LL | #![feature(specialization)]
+ | ^^^^^^^^^^^^^^
+ |
+ = note: see issue #31844 <https://github.com/rust-lang/rust/issues/31844> for more information
+ = help: consider using `min_specialization` instead, which is more stable and complete
+ = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/traits/new-solver/nested-alias-bound.rs b/tests/ui/traits/new-solver/nested-alias-bound.rs
new file mode 100644
index 000000000..c365902db
--- /dev/null
+++ b/tests/ui/traits/new-solver/nested-alias-bound.rs
@@ -0,0 +1,20 @@
+// compile-flags: -Ztrait-solver=next
+// check-pass
+
+trait A {
+ type A: B;
+}
+
+trait B {
+ type B: C;
+}
+
+trait C {}
+
+fn needs_c<T: C>() {}
+
+fn test<T: A>() {
+ needs_c::<<T::A as B>::B>();
+}
+
+fn main() {}
diff --git a/tests/ui/traits/new-solver/normalize-rcvr-for-inherent.rs b/tests/ui/traits/new-solver/normalize-rcvr-for-inherent.rs
new file mode 100644
index 000000000..d70534feb
--- /dev/null
+++ b/tests/ui/traits/new-solver/normalize-rcvr-for-inherent.rs
@@ -0,0 +1,25 @@
+// compile-flags: -Ztrait-solver=next
+// check-pass
+
+// Verify that we can assemble inherent impl candidates on a possibly
+// unnormalized self type.
+
+trait Foo {
+ type Assoc;
+}
+impl Foo for i32 {
+ type Assoc = Bar;
+}
+
+struct Bar;
+impl Bar {
+ fn method(&self) {}
+}
+
+fn build<T: Foo>(_: T) -> T::Assoc {
+ todo!()
+}
+
+fn main() {
+ build(1i32).method();
+}
diff --git a/tests/ui/traits/new-solver/structural-resolve-field.rs b/tests/ui/traits/new-solver/structural-resolve-field.rs
new file mode 100644
index 000000000..01899c9ad
--- /dev/null
+++ b/tests/ui/traits/new-solver/structural-resolve-field.rs
@@ -0,0 +1,13 @@
+// compile-flags: -Ztrait-solver=next
+// check-pass
+
+#[derive(Default)]
+struct Foo {
+ x: i32,
+}
+
+fn main() {
+ let mut xs = <[Foo; 1]>::default();
+ xs[0].x = 1;
+ (&mut xs[0]).x = 2;
+}
diff --git a/tests/ui/traits/new-solver/temporary-ambiguity.rs b/tests/ui/traits/new-solver/temporary-ambiguity.rs
index 18ee05457..c6c11a1a1 100644
--- a/tests/ui/traits/new-solver/temporary-ambiguity.rs
+++ b/tests/ui/traits/new-solver/temporary-ambiguity.rs
@@ -18,5 +18,5 @@ fn main() {
let w = Wrapper(x);
needs_foo(w);
x = 1;
- drop(x);
+ let _ = x;
}
diff --git a/tests/ui/traits/new-solver/two-projection-param-candidates-are-ambiguous.rs b/tests/ui/traits/new-solver/two-projection-param-candidates-are-ambiguous.rs
index cde2059ca..3c7fc0d81 100644
--- a/tests/ui/traits/new-solver/two-projection-param-candidates-are-ambiguous.rs
+++ b/tests/ui/traits/new-solver/two-projection-param-candidates-are-ambiguous.rs
@@ -1,7 +1,7 @@
// compile-flags: -Ztrait-solver=next
// When we're solving `<T as Foo>::Assoc = i32`, we actually first solve
-// `<T as Foo>::Assoc = _#1t`, then unify `_#1t` with `i32`. That goal
+// `<T as Foo>::Assoc = ?1t`, then unify `?1t` with `i32`. That goal
// with the inference variable is ambiguous when there are >1 param-env
// candidates.
diff --git a/tests/ui/traits/non_lifetime_binders/drop-impl-pred.no.stderr b/tests/ui/traits/non_lifetime_binders/drop-impl-pred.no.stderr
new file mode 100644
index 000000000..a985b1a6e
--- /dev/null
+++ b/tests/ui/traits/non_lifetime_binders/drop-impl-pred.no.stderr
@@ -0,0 +1,24 @@
+warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
+ --> $DIR/drop-impl-pred.rs:6:12
+ |
+LL | #![feature(non_lifetime_binders)]
+ | ^^^^^^^^^^^^^^^^^^^^
+ |
+ = note: see issue #108185 <https://github.com/rust-lang/rust/issues/108185> for more information
+ = note: `#[warn(incomplete_features)]` on by default
+
+error[E0367]: `Drop` impl requires `H: Foo` but the struct it is implemented for does not
+ --> $DIR/drop-impl-pred.rs:19:15
+ |
+LL | for<H> H: Foo,
+ | ^^^
+ |
+note: the implementor must specify the same requirement
+ --> $DIR/drop-impl-pred.rs:12:1
+ |
+LL | struct Bar<T>(T) where T: Foo;
+ | ^^^^^^^^^^^^^
+
+error: aborting due to previous error; 1 warning emitted
+
+For more information about this error, try `rustc --explain E0367`.
diff --git a/tests/ui/traits/non_lifetime_binders/drop-impl-pred.rs b/tests/ui/traits/non_lifetime_binders/drop-impl-pred.rs
new file mode 100644
index 000000000..c65b5ea9b
--- /dev/null
+++ b/tests/ui/traits/non_lifetime_binders/drop-impl-pred.rs
@@ -0,0 +1,25 @@
+// revisions: no yes
+//[yes] check-pass
+
+// Issue 110557
+
+#![feature(non_lifetime_binders)]
+//~^ WARN the feature `non_lifetime_binders` is incomplete
+
+pub trait Foo {}
+
+#[cfg(no)]
+struct Bar<T>(T) where T: Foo;
+
+#[cfg(yes)]
+struct Bar<T>(T) where for<H> H: Foo;
+
+impl<T> Drop for Bar<T>
+where
+ for<H> H: Foo,
+//[no]~^ ERROR `Drop` impl requires `H: Foo` but the struct it is implemented for does not
+{
+ fn drop(&mut self) {}
+}
+
+fn main() {}
diff --git a/tests/ui/traits/non_lifetime_binders/drop-impl-pred.yes.stderr b/tests/ui/traits/non_lifetime_binders/drop-impl-pred.yes.stderr
new file mode 100644
index 000000000..165cf2ee1
--- /dev/null
+++ b/tests/ui/traits/non_lifetime_binders/drop-impl-pred.yes.stderr
@@ -0,0 +1,11 @@
+warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
+ --> $DIR/drop-impl-pred.rs:6:12
+ |
+LL | #![feature(non_lifetime_binders)]
+ | ^^^^^^^^^^^^^^^^^^^^
+ |
+ = note: see issue #108185 <https://github.com/rust-lang/rust/issues/108185> for more information
+ = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/traits/non_lifetime_binders/supertrait-object-safety.stderr b/tests/ui/traits/non_lifetime_binders/supertrait-object-safety.stderr
index 47fa29b66..d56519223 100644
--- a/tests/ui/traits/non_lifetime_binders/supertrait-object-safety.stderr
+++ b/tests/ui/traits/non_lifetime_binders/supertrait-object-safety.stderr
@@ -20,8 +20,7 @@ LL | trait Foo: for<T> Bar<T> {}
| --- ^^^^^^^^^^^^^ ...because where clause cannot reference non-lifetime `for<...>` variables
| |
| this trait cannot be made into an object...
- = note: required for `&()` to implement `CoerceUnsized<&dyn Foo>`
- = note: required by cast to type `&dyn Foo`
+ = note: required for the cast from `&()` to `&dyn Foo`
error[E0038]: the trait `Foo` cannot be made into an object
--> $DIR/supertrait-object-safety.rs:19:12
diff --git a/tests/ui/traits/non_lifetime_binders/universe-error1.rs b/tests/ui/traits/non_lifetime_binders/universe-error1.rs
new file mode 100644
index 000000000..eadee6b71
--- /dev/null
+++ b/tests/ui/traits/non_lifetime_binders/universe-error1.rs
@@ -0,0 +1,18 @@
+#![feature(non_lifetime_binders)]
+//~^ WARN the feature `non_lifetime_binders` is incomplete
+
+trait Other<U: ?Sized> {}
+
+impl<U: ?Sized> Other<U> for U {}
+
+#[rustfmt::skip]
+fn foo<U: ?Sized>()
+where
+ for<T> T: Other<U> {}
+
+fn bar() {
+ foo::<_>();
+ //~^ ERROR the trait bound `T: Other<_>` is not satisfied
+}
+
+fn main() {}
diff --git a/tests/ui/traits/non_lifetime_binders/universe-error1.stderr b/tests/ui/traits/non_lifetime_binders/universe-error1.stderr
new file mode 100644
index 000000000..bfcad72e3
--- /dev/null
+++ b/tests/ui/traits/non_lifetime_binders/universe-error1.stderr
@@ -0,0 +1,27 @@
+warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
+ --> $DIR/universe-error1.rs:1:12
+ |
+LL | #![feature(non_lifetime_binders)]
+ | ^^^^^^^^^^^^^^^^^^^^
+ |
+ = note: see issue #108185 <https://github.com/rust-lang/rust/issues/108185> for more information
+ = note: `#[warn(incomplete_features)]` on by default
+
+error[E0277]: the trait bound `T: Other<_>` is not satisfied
+ --> $DIR/universe-error1.rs:14:11
+ |
+LL | foo::<_>();
+ | ^ the trait `Other<_>` is not implemented for `T`
+ |
+note: required by a bound in `foo`
+ --> $DIR/universe-error1.rs:11:15
+ |
+LL | fn foo<U: ?Sized>()
+ | --- required by a bound in this function
+LL | where
+LL | for<T> T: Other<U> {}
+ | ^^^^^^^^ required by this bound in `foo`
+
+error: aborting due to previous error; 1 warning emitted
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/traits/object/safety.stderr b/tests/ui/traits/object/safety.stderr
index dc18adeaf..a51b69759 100644
--- a/tests/ui/traits/object/safety.stderr
+++ b/tests/ui/traits/object/safety.stderr
@@ -11,8 +11,7 @@ LL | trait Tr {
| -- this trait cannot be made into an object...
LL | fn foo();
| ^^^ ...because associated function `foo` has no `self` parameter
- = note: required for `&St` to implement `CoerceUnsized<&dyn Tr>`
- = note: required by cast to type `&dyn Tr`
+ = note: required for the cast from `&St` to `&dyn Tr`
help: consider turning `foo` into a method by giving it a `&self` argument
|
LL | fn foo(&self);
diff --git a/tests/ui/traits/test-2.stderr b/tests/ui/traits/test-2.stderr
index 6c0e8b8af..74a0fc427 100644
--- a/tests/ui/traits/test-2.stderr
+++ b/tests/ui/traits/test-2.stderr
@@ -76,8 +76,7 @@ LL | trait bar { fn dup(&self) -> Self; fn blah<X>(&self); }
| this trait cannot be made into an object...
= help: consider moving `dup` to another trait
= help: consider moving `blah` to another trait
- = note: required for `Box<{integer}>` to implement `CoerceUnsized<Box<dyn bar>>`
- = note: required by cast to type `Box<dyn bar>`
+ = note: required for the cast from `Box<{integer}>` to `Box<dyn bar>`
error: aborting due to 5 previous errors
diff --git a/tests/ui/traits/trait-upcasting/type-checking-test-1.stderr b/tests/ui/traits/trait-upcasting/type-checking-test-1.stderr
index fe269d8e9..82b4e9bd7 100644
--- a/tests/ui/traits/trait-upcasting/type-checking-test-1.stderr
+++ b/tests/ui/traits/trait-upcasting/type-checking-test-1.stderr
@@ -15,7 +15,7 @@ error[E0277]: the trait bound `&dyn Foo: Bar<_>` is not satisfied
LL | let _ = x as &dyn Bar<_>; // Ambiguous
| ^ the trait `Bar<_>` is not implemented for `&dyn Foo`
|
- = note: required for the cast from `&dyn Foo` to the object type `dyn Bar<_>`
+ = note: required for the cast from `&&dyn Foo` to `&dyn Bar<_>`
error: aborting due to 2 previous errors
diff --git a/tests/ui/traits/trait-upcasting/type-checking-test-2.stderr b/tests/ui/traits/trait-upcasting/type-checking-test-2.stderr
index ef007d5cb..856303ef4 100644
--- a/tests/ui/traits/trait-upcasting/type-checking-test-2.stderr
+++ b/tests/ui/traits/trait-upcasting/type-checking-test-2.stderr
@@ -15,7 +15,7 @@ error[E0277]: the trait bound `&dyn Foo<i32>: Bar<u32>` is not satisfied
LL | let _ = x as &dyn Bar<u32>; // Error
| ^ the trait `Bar<u32>` is not implemented for `&dyn Foo<i32>`
|
- = note: required for the cast from `&dyn Foo<i32>` to the object type `dyn Bar<u32>`
+ = note: required for the cast from `&&dyn Foo<i32>` to `&dyn Bar<u32>`
error[E0605]: non-primitive cast: `&dyn Foo<u32>` as `&dyn Bar<_>`
--> $DIR/type-checking-test-2.rs:25:13
@@ -34,7 +34,7 @@ error[E0277]: the trait bound `&dyn Foo<u32>: Bar<_>` is not satisfied
LL | let a = x as &dyn Bar<_>; // Ambiguous
| ^ the trait `Bar<_>` is not implemented for `&dyn Foo<u32>`
|
- = note: required for the cast from `&dyn Foo<u32>` to the object type `dyn Bar<_>`
+ = note: required for the cast from `&&dyn Foo<u32>` to `&dyn Bar<_>`
error: aborting due to 4 previous errors
diff --git a/tests/ui/traits/unsend-future.stderr b/tests/ui/traits/unsend-future.stderr
index 4aaa7c4a9..6ce1cf452 100644
--- a/tests/ui/traits/unsend-future.stderr
+++ b/tests/ui/traits/unsend-future.stderr
@@ -6,12 +6,12 @@ LL | require_handler(handler)
|
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `*const i32`
note: future is not `Send` as this value is used across an await
- --> $DIR/unsend-future.rs:15:13
+ --> $DIR/unsend-future.rs:15:14
|
LL | let a = &1 as *const i32;
| - has type `*const i32` which is not `Send`
LL | async {}.await;
- | ^^^^^^ await occurs here, with `a` maybe used later
+ | ^^^^^ await occurs here, with `a` maybe used later
LL | }
| - `a` is later dropped here
note: required by a bound in `require_handler`