File tree Expand file tree Collapse file tree 2 files changed +97
-0
lines changed Expand file tree Collapse file tree 2 files changed +97
-0
lines changed Original file line number Diff line number Diff line change
1
+ error[E0277]: the trait bound `(): std::error::Error` is not satisfied
2
+ --> $DIR/coerce-issue-49593-box-never.rs:18:53
3
+ |
4
+ LL | /* *mut $0 is coerced to Box<dyn Error> here */ Box::<_ /* ! */>::new(x)
5
+ | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::error::Error` is not implemented for `()`
6
+ |
7
+ = help: the following other types implement trait `std::error::Error`:
8
+ !
9
+ &'a T
10
+ AccessError
11
+ AddrParseError
12
+ Arc<T>
13
+ BorrowError
14
+ BorrowMutError
15
+ Box<T>
16
+ and 45 others
17
+ = note: required for the cast to the object type `dyn std::error::Error`
18
+
19
+ error[E0277]: the trait bound `(): std::error::Error` is not satisfied
20
+ --> $DIR/coerce-issue-49593-box-never.rs:23:49
21
+ |
22
+ LL | /* *mut $0 is coerced to *mut Error here */ raw_ptr_box::<_ /* ! */>(x)
23
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::error::Error` is not implemented for `()`
24
+ |
25
+ = help: the following other types implement trait `std::error::Error`:
26
+ !
27
+ &'a T
28
+ AccessError
29
+ AddrParseError
30
+ Arc<T>
31
+ BorrowError
32
+ BorrowMutError
33
+ Box<T>
34
+ and 45 others
35
+ = note: required for the cast to the object type `(dyn std::error::Error + 'static)`
36
+
37
+ error: aborting due to 2 previous errors
38
+
39
+ For more information about this error, try `rustc --explain E0277`.
Original file line number Diff line number Diff line change
1
+ // revisions: nofallback fallback
2
+ // only-windows - the number of `Error` impls is platform-dependent
3
+ //[fallback] check-pass
4
+ //[nofallback] check-fail
5
+
6
+ #![feature(never_type)]
7
+ #![cfg_attr(fallback, feature(never_type_fallback))]
8
+ #![allow(unreachable_code)]
9
+
10
+ use std::error::Error;
11
+ use std::mem;
12
+
13
+ fn raw_ptr_box<T>(t: T) -> *mut T {
14
+ panic!()
15
+ }
16
+
17
+ fn foo(x: !) -> Box<dyn Error> {
18
+ /* *mut $0 is coerced to Box<dyn Error> here */ Box::<_ /* ! */>::new(x)
19
+ //[nofallback]~^ ERROR trait bound `(): std::error::Error` is not satisfied
20
+ }
21
+
22
+ fn foo_raw_ptr(x: !) -> *mut dyn Error {
23
+ /* *mut $0 is coerced to *mut Error here */ raw_ptr_box::<_ /* ! */>(x)
24
+ //[nofallback]~^ ERROR trait bound `(): std::error::Error` is not satisfied
25
+ }
26
+
27
+ fn no_coercion(d: *mut dyn Error) -> *mut dyn Error {
28
+ /* an unsize coercion won't compile here, and it is indeed not used
29
+ because there is nothing requiring the _ to be Sized */
30
+ d as *mut _
31
+ }
32
+
33
+ trait Xyz {}
34
+ struct S;
35
+ struct T;
36
+ impl Xyz for S {}
37
+ impl Xyz for T {}
38
+
39
+ fn foo_no_never() {
40
+ let mut x /* : Option<S> */ = None;
41
+ let mut first_iter = false;
42
+ loop {
43
+ if !first_iter {
44
+ let y: Box<dyn Xyz>
45
+ = /* Box<$0> is coerced to Box<Xyz> here */ Box::new(x.unwrap());
46
+ }
47
+
48
+ x = Some(S);
49
+ first_iter = true;
50
+ }
51
+
52
+ let mut y : Option<S> = None;
53
+ // assert types are equal
54
+ mem::swap(&mut x, &mut y);
55
+ }
56
+
57
+ fn main() {
58
+ }
You can’t perform that action at this time.
0 commit comments