]> git.proxmox.com Git - rustc.git/blame - src/test/ui/coercion/coerce-issue-49593-box-never-windows.rs
New upstream version 1.66.0+dfsg1
[rustc.git] / src / test / ui / coercion / coerce-issue-49593-box-never-windows.rs
CommitLineData
04454e1e
FG
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
10use std::error::Error;
11use std::mem;
12
13fn raw_ptr_box<T>(t: T) -> *mut T {
14 panic!()
15}
16
17fn 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
22fn 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
27fn 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
33trait Xyz {}
34struct S;
35struct T;
36impl Xyz for S {}
37impl Xyz for T {}
38
39fn 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
57fn main() {
58}