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