From 80157a560f3b139e0209d358ef275a84bccd99ed Mon Sep 17 00:00:00 2001 From: Waffle Lapkin Date: Fri, 17 Jan 2025 14:57:22 +0100 Subject: [PATCH] bless tests yay, I fixed the bug/missing feature :') --- .../ui/cast/ptr-to-trait-obj-wrap-add-auto.rs | 8 +- .../ptr-to-trait-obj-wrap-add-auto.stderr | 93 +++---------------- .../ptr-to-trait-obj-wrap-different-args.rs | 6 +- ...tr-to-trait-obj-wrap-different-args.stderr | 63 +++---------- ...to-trait-obj-wrap-different-regions.stderr | 69 +++++++------- tests/ui/cast/ptr-to-trait-obj-wrap.rs | 5 +- tests/ui/cast/ptr-to-trait-obj-wrap.stderr | 57 ------------ 7 files changed, 66 insertions(+), 235 deletions(-) delete mode 100644 tests/ui/cast/ptr-to-trait-obj-wrap.stderr diff --git a/tests/ui/cast/ptr-to-trait-obj-wrap-add-auto.rs b/tests/ui/cast/ptr-to-trait-obj-wrap-add-auto.rs index 2e5a9d0d3b58..cfc0a97989dc 100644 --- a/tests/ui/cast/ptr-to-trait-obj-wrap-add-auto.rs +++ b/tests/ui/cast/ptr-to-trait-obj-wrap-add-auto.rs @@ -10,16 +10,12 @@ struct X(T); fn unwrap(a: *const W) -> *const (dyn A + Send) { a as _ - //~^ error - //~| error - //~| error + //~^ error: cannot add auto trait `Send` to dyn bound via pointer cast } fn unwrap_nested(a: *const W>) -> *const W { a as _ - //~^ error - //~| error - //~| error + //~^ error: cannot add auto trait `Send` to dyn bound via pointer cast } fn rewrap(a: *const W) -> *const X { diff --git a/tests/ui/cast/ptr-to-trait-obj-wrap-add-auto.stderr b/tests/ui/cast/ptr-to-trait-obj-wrap-add-auto.stderr index 00a27156f077..42cdbc34ee82 100644 --- a/tests/ui/cast/ptr-to-trait-obj-wrap-add-auto.stderr +++ b/tests/ui/cast/ptr-to-trait-obj-wrap-add-auto.stderr @@ -1,87 +1,23 @@ -error[E0277]: the trait bound `W<(dyn A + 'static)>: A` is not satisfied - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:12:5 - | -LL | a as _ - | ^ the trait `A` is not implemented for `W<(dyn A + 'static)>` - | -help: this trait has no implementations, consider adding one - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:6:1 - | -LL | trait A {} - | ^^^^^^^ - = note: required for the cast from `*const W<(dyn A + 'static)>` to `*const dyn A + Send` - -error[E0277]: `(dyn A + 'static)` cannot be sent between threads safely - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:12:5 - | -LL | a as _ - | ^ `(dyn A + 'static)` cannot be sent between threads safely - | - = help: within `W<(dyn A + 'static)>`, the trait `Send` is not implemented for `(dyn A + 'static)` -note: required because it appears within the type `W<(dyn A + 'static)>` - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:8:8 - | -LL | struct W(T); - | ^ - = note: required for the cast from `*const W<(dyn A + 'static)>` to `*const dyn A + Send` - -error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time +error[E0804]: cannot add auto trait `Send` to dyn bound via pointer cast --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:12:5 | LL | a as _ - | ^ doesn't have a size known at compile-time - | - = help: within `W<(dyn A + 'static)>`, the trait `Sized` is not implemented for `(dyn A + 'static)` -note: required because it appears within the type `W<(dyn A + 'static)>` - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:8:8 - | -LL | struct W(T); - | ^ - = note: required for the cast from `*const W<(dyn A + 'static)>` to `*const dyn A + Send` - -error[E0277]: the trait bound `W<(dyn A + 'static)>: A` is not satisfied - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:19:5 - | -LL | a as _ - | ^ the trait `A` is not implemented for `W<(dyn A + 'static)>` - | -help: this trait has no implementations, consider adding one - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:6:1 - | -LL | trait A {} - | ^^^^^^^ - = note: required for the cast from `*const W>` to `*const W` - -error[E0277]: `(dyn A + 'static)` cannot be sent between threads safely - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:19:5 - | -LL | a as _ - | ^ `(dyn A + 'static)` cannot be sent between threads safely - | - = help: within `W<(dyn A + 'static)>`, the trait `Send` is not implemented for `(dyn A + 'static)` -note: required because it appears within the type `W<(dyn A + 'static)>` - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:8:8 + | ^^^^^^ unsupported cast | -LL | struct W(T); - | ^ - = note: required for the cast from `*const W>` to `*const W` + = note: this could allow UB elsewhere + = help: use `transmute` if you're sure this is sound -error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:19:5 +error[E0804]: cannot add auto trait `Send` to dyn bound via pointer cast + --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:17:5 | LL | a as _ - | ^ doesn't have a size known at compile-time - | - = help: within `W<(dyn A + 'static)>`, the trait `Sized` is not implemented for `(dyn A + 'static)` -note: required because it appears within the type `W<(dyn A + 'static)>` - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:8:8 + | ^^^^^^ unsupported cast | -LL | struct W(T); - | ^ - = note: required for the cast from `*const W>` to `*const W` + = note: this could allow UB elsewhere + = help: use `transmute` if you're sure this is sound error[E0804]: cannot add auto trait `Send` to dyn bound via pointer cast - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:26:5 + --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:22:5 | LL | a as _ | ^^^^^^ unsupported cast @@ -90,7 +26,7 @@ LL | a as _ = help: use `transmute` if you're sure this is sound error[E0804]: cannot add auto trait `Send` to dyn bound via pointer cast - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:31:5 + --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:27:5 | LL | a as _ | ^^^^^^ unsupported cast @@ -99,7 +35,7 @@ LL | a as _ = help: use `transmute` if you're sure this is sound error[E0804]: cannot add auto trait `Send` to dyn bound via pointer cast - --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:36:5 + --> $DIR/ptr-to-trait-obj-wrap-add-auto.rs:32:5 | LL | a as _ | ^^^^^^ unsupported cast @@ -107,7 +43,6 @@ LL | a as _ = note: this could allow UB elsewhere = help: use `transmute` if you're sure this is sound -error: aborting due to 9 previous errors +error: aborting due to 5 previous errors -Some errors have detailed explanations: E0277, E0804. -For more information about an error, try `rustc --explain E0277`. +For more information about this error, try `rustc --explain E0804`. diff --git a/tests/ui/cast/ptr-to-trait-obj-wrap-different-args.rs b/tests/ui/cast/ptr-to-trait-obj-wrap-different-args.rs index 55dc0aa184da..ebe7a06a7a15 100644 --- a/tests/ui/cast/ptr-to-trait-obj-wrap-different-args.rs +++ b/tests/ui/cast/ptr-to-trait-obj-wrap-different-args.rs @@ -10,14 +10,12 @@ struct X(T); fn unwrap(a: *const W>) -> *const dyn A { a as _ - //~^ error - //~| error + //~^ error casting `*const W<(dyn A + 'static)>` as `*const dyn A` is invalid } fn unwrap_nested(a: *const W>>) -> *const W> { a as _ - //~^ error - //~| error + //~^ error casting `*const W + 'static)>>` as `*const W>` is invalid } fn rewrap(a: *const W>) -> *const X> { diff --git a/tests/ui/cast/ptr-to-trait-obj-wrap-different-args.stderr b/tests/ui/cast/ptr-to-trait-obj-wrap-different-args.stderr index 59543229de7f..4f85b208d05a 100644 --- a/tests/ui/cast/ptr-to-trait-obj-wrap-different-args.stderr +++ b/tests/ui/cast/ptr-to-trait-obj-wrap-different-args.stderr @@ -1,59 +1,21 @@ -error[E0277]: the trait bound `W<(dyn A + 'static)>: A` is not satisfied +error[E0606]: casting `*const W<(dyn A + 'static)>` as `*const dyn A` is invalid --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:12:5 | LL | a as _ - | ^ the trait `A` is not implemented for `W<(dyn A + 'static)>` - | -help: this trait has no implementations, consider adding one - --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:6:1 - | -LL | trait A {} - | ^^^^^^^^^^ - = note: required for the cast from `*const W<(dyn A + 'static)>` to `*const dyn A` - -error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time - --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:12:5 - | -LL | a as _ - | ^ doesn't have a size known at compile-time - | - = help: within `W<(dyn A + 'static)>`, the trait `Sized` is not implemented for `(dyn A + 'static)` -note: required because it appears within the type `W<(dyn A + 'static)>` - --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:8:8 - | -LL | struct W(T); - | ^ - = note: required for the cast from `*const W<(dyn A + 'static)>` to `*const dyn A` - -error[E0277]: the trait bound `W<(dyn A + 'static)>: A` is not satisfied - --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:18:5 - | -LL | a as _ - | ^ the trait `A` is not implemented for `W<(dyn A + 'static)>` - | -help: this trait has no implementations, consider adding one - --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:6:1 + | ^^^^^^ | -LL | trait A {} - | ^^^^^^^^^^ - = note: required for the cast from `*const W + 'static)>>` to `*const W>` + = note: the trait objects may have different vtables -error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time - --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:18:5 +error[E0606]: casting `*const W + 'static)>>` as `*const W>` is invalid + --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:17:5 | LL | a as _ - | ^ doesn't have a size known at compile-time - | - = help: within `W<(dyn A + 'static)>`, the trait `Sized` is not implemented for `(dyn A + 'static)` -note: required because it appears within the type `W<(dyn A + 'static)>` - --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:8:8 + | ^^^^^^ | -LL | struct W(T); - | ^ - = note: required for the cast from `*const W + 'static)>>` to `*const W>` + = note: the trait objects may have different vtables error[E0606]: casting `*const W<(dyn A + 'static)>` as `*const X>` is invalid - --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:24:5 + --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:22:5 | LL | a as _ | ^^^^^^ @@ -61,7 +23,7 @@ LL | a as _ = note: the trait objects may have different vtables error[E0606]: casting `*const W + 'static)>>` as `*const W>>` is invalid - --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:29:5 + --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:27:5 | LL | a as _ | ^^^^^^ @@ -69,14 +31,13 @@ LL | a as _ = note: the trait objects may have different vtables error[E0606]: casting `*const (dyn A + 'static)` as `*const W>` is invalid - --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:34:5 + --> $DIR/ptr-to-trait-obj-wrap-different-args.rs:32:5 | LL | a as _ | ^^^^^^ | = note: the trait objects may have different vtables -error: aborting due to 7 previous errors +error: aborting due to 5 previous errors -Some errors have detailed explanations: E0277, E0606. -For more information about an error, try `rustc --explain E0277`. +For more information about this error, try `rustc --explain E0606`. diff --git a/tests/ui/cast/ptr-to-trait-obj-wrap-different-regions.stderr b/tests/ui/cast/ptr-to-trait-obj-wrap-different-regions.stderr index 3d5fafea2eef..17a0ca3c34fc 100644 --- a/tests/ui/cast/ptr-to-trait-obj-wrap-different-regions.stderr +++ b/tests/ui/cast/ptr-to-trait-obj-wrap-different-regions.stderr @@ -1,56 +1,56 @@ -error[E0277]: the trait bound `W<(dyn A<'a> + 'static)>: A<'b>` is not satisfied +error: lifetime may not live long enough --> $DIR/ptr-to-trait-obj-wrap-different-regions.rs:12:5 | +LL | fn unwrap<'a, 'b>(a: *const W>) -> *const dyn A<'b> { + | -- -- lifetime `'b` defined here + | | + | lifetime `'a` defined here LL | a as _ - | ^ the trait `A<'b>` is not implemented for `W<(dyn A<'a> + 'static)>` - | -help: this trait has no implementations, consider adding one - --> $DIR/ptr-to-trait-obj-wrap-different-regions.rs:6:1 + | ^^^^^^ function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'b` | -LL | trait A<'a> {} - | ^^^^^^^^^^^ - = note: required for the cast from `*const W<(dyn A<'a> + 'static)>` to `*const dyn A<'b>` + = help: consider adding the following bound: `'b: 'a` -error[E0277]: the size for values of type `(dyn A<'a> + 'static)` cannot be known at compilation time +error: lifetime may not live long enough --> $DIR/ptr-to-trait-obj-wrap-different-regions.rs:12:5 | +LL | fn unwrap<'a, 'b>(a: *const W>) -> *const dyn A<'b> { + | -- -- lifetime `'b` defined here + | | + | lifetime `'a` defined here LL | a as _ - | ^ doesn't have a size known at compile-time - | - = help: within `W<(dyn A<'a> + 'static)>`, the trait `Sized` is not implemented for `(dyn A<'a> + 'static)` -note: required because it appears within the type `W<(dyn A<'a> + 'static)>` - --> $DIR/ptr-to-trait-obj-wrap-different-regions.rs:8:8 + | ^^^^^^ function was supposed to return data with lifetime `'b` but it is returning data with lifetime `'a` | -LL | struct W(T); - | ^ - = note: required for the cast from `*const W<(dyn A<'a> + 'static)>` to `*const dyn A<'b>` + = help: consider adding the following bound: `'a: 'b` + +help: `'b` and `'a` must be the same: replace one with the other -error[E0277]: the trait bound `W<(dyn A<'a> + 'static)>: A<'b>` is not satisfied +error: lifetime may not live long enough --> $DIR/ptr-to-trait-obj-wrap-different-regions.rs:18:5 | +LL | fn unwrap_nested<'a, 'b>(a: *const W>>) -> *const W> { + | -- -- lifetime `'b` defined here + | | + | lifetime `'a` defined here LL | a as _ - | ^ the trait `A<'b>` is not implemented for `W<(dyn A<'a> + 'static)>` - | -help: this trait has no implementations, consider adding one - --> $DIR/ptr-to-trait-obj-wrap-different-regions.rs:6:1 + | ^^^^^^ function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'b` | -LL | trait A<'a> {} - | ^^^^^^^^^^^ - = note: required for the cast from `*const W + 'static)>>` to `*const W>` + = help: consider adding the following bound: `'b: 'a` -error[E0277]: the size for values of type `(dyn A<'a> + 'static)` cannot be known at compilation time +error: lifetime may not live long enough --> $DIR/ptr-to-trait-obj-wrap-different-regions.rs:18:5 | +LL | fn unwrap_nested<'a, 'b>(a: *const W>>) -> *const W> { + | -- -- lifetime `'b` defined here + | | + | lifetime `'a` defined here LL | a as _ - | ^ doesn't have a size known at compile-time + | ^^^^^^ function was supposed to return data with lifetime `'b` but it is returning data with lifetime `'a` | - = help: within `W<(dyn A<'a> + 'static)>`, the trait `Sized` is not implemented for `(dyn A<'a> + 'static)` -note: required because it appears within the type `W<(dyn A<'a> + 'static)>` - --> $DIR/ptr-to-trait-obj-wrap-different-regions.rs:8:8 + = help: consider adding the following bound: `'a: 'b` + +help: `'b` and `'a` must be the same: replace one with the other | -LL | struct W(T); - | ^ - = note: required for the cast from `*const W + 'static)>>` to `*const W>` + = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` error: lifetime may not live long enough --> $DIR/ptr-to-trait-obj-wrap-different-regions.rs:24:5 @@ -77,6 +77,8 @@ LL | a as _ = help: consider adding the following bound: `'a: 'b` help: `'b` and `'a` must be the same: replace one with the other + | + = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` error: lifetime may not live long enough --> $DIR/ptr-to-trait-obj-wrap-different-regions.rs:30:5 @@ -136,4 +138,3 @@ help: `'b` and `'a` must be the same: replace one with the other error: aborting due to 10 previous errors -For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/cast/ptr-to-trait-obj-wrap.rs b/tests/ui/cast/ptr-to-trait-obj-wrap.rs index f45cedcab728..6f9f6bddb996 100644 --- a/tests/ui/cast/ptr-to-trait-obj-wrap.rs +++ b/tests/ui/cast/ptr-to-trait-obj-wrap.rs @@ -3,6 +3,7 @@ // structure, so these casts *are* fine. // // `unwrap` and `unwrap_nested` currently don't work due to a compiler limitation. +//@ check-pass trait A {} @@ -11,14 +12,10 @@ struct X(T); fn unwrap(a: *const W) -> *const dyn A { a as _ - //~^ error - //~| error } fn unwrap_nested(a: *const W>) -> *const W { a as _ - //~^ error - //~| error } fn rewrap(a: *const W) -> *const X { diff --git a/tests/ui/cast/ptr-to-trait-obj-wrap.stderr b/tests/ui/cast/ptr-to-trait-obj-wrap.stderr deleted file mode 100644 index 3003363c04ab..000000000000 --- a/tests/ui/cast/ptr-to-trait-obj-wrap.stderr +++ /dev/null @@ -1,57 +0,0 @@ -error[E0277]: the trait bound `W<(dyn A + 'static)>: A` is not satisfied - --> $DIR/ptr-to-trait-obj-wrap.rs:13:5 - | -LL | a as _ - | ^ the trait `A` is not implemented for `W<(dyn A + 'static)>` - | -help: this trait has no implementations, consider adding one - --> $DIR/ptr-to-trait-obj-wrap.rs:7:1 - | -LL | trait A {} - | ^^^^^^^ - = note: required for the cast from `*const W<(dyn A + 'static)>` to `*const dyn A` - -error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time - --> $DIR/ptr-to-trait-obj-wrap.rs:13:5 - | -LL | a as _ - | ^ doesn't have a size known at compile-time - | - = help: within `W<(dyn A + 'static)>`, the trait `Sized` is not implemented for `(dyn A + 'static)` -note: required because it appears within the type `W<(dyn A + 'static)>` - --> $DIR/ptr-to-trait-obj-wrap.rs:9:8 - | -LL | struct W(T); - | ^ - = note: required for the cast from `*const W<(dyn A + 'static)>` to `*const dyn A` - -error[E0277]: the trait bound `W<(dyn A + 'static)>: A` is not satisfied - --> $DIR/ptr-to-trait-obj-wrap.rs:19:5 - | -LL | a as _ - | ^ the trait `A` is not implemented for `W<(dyn A + 'static)>` - | -help: this trait has no implementations, consider adding one - --> $DIR/ptr-to-trait-obj-wrap.rs:7:1 - | -LL | trait A {} - | ^^^^^^^ - = note: required for the cast from `*const W>` to `*const W` - -error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time - --> $DIR/ptr-to-trait-obj-wrap.rs:19:5 - | -LL | a as _ - | ^ doesn't have a size known at compile-time - | - = help: within `W<(dyn A + 'static)>`, the trait `Sized` is not implemented for `(dyn A + 'static)` -note: required because it appears within the type `W<(dyn A + 'static)>` - --> $DIR/ptr-to-trait-obj-wrap.rs:9:8 - | -LL | struct W(T); - | ^ - = note: required for the cast from `*const W>` to `*const W` - -error: aborting due to 4 previous errors - -For more information about this error, try `rustc --explain E0277`.