| //! Regression test for https://github.com/rust-lang/rust/issues/15763 | |
| //@ run-pass | |
| #![allow(unreachable_code)] | |
| #[derive(PartialEq, Debug)] | |
| struct Bar { | |
| x: isize | |
| } | |
| impl Drop for Bar { | |
| fn drop(&mut self) { | |
| assert_eq!(self.x, 22); | |
| } | |
| } | |
| #[derive(PartialEq, Debug)] | |
| struct Foo { | |
| x: Bar, | |
| a: isize | |
| } | |
| fn foo() -> Result<Foo, isize> { | |
| return Ok(Foo { | |
| x: Bar { x: 22 }, | |
| a: return Err(32) | |
| }); | |
| } | |
| fn baz() -> Result<Foo, isize> { | |
| Ok(Foo { | |
| x: Bar { x: 22 }, | |
| a: return Err(32) | |
| }) | |
| } | |
| // explicit immediate return | |
| fn aa() -> isize { | |
| return 3; | |
| } | |
| // implicit immediate return | |
| fn bb() -> isize { | |
| 3 | |
| } | |
| // implicit outptr return | |
| fn cc() -> Result<isize, isize> { | |
| Ok(3) | |
| } | |
| // explicit outptr return | |
| fn dd() -> Result<isize, isize> { | |
| return Ok(3); | |
| } | |
| trait A { | |
| fn aaa(&self) -> isize { | |
| 3 | |
| } | |
| fn bbb(&self) -> isize { | |
| return 3; | |
| } | |
| fn ccc(&self) -> Result<isize, isize> { | |
| Ok(3) | |
| } | |
| fn ddd(&self) -> Result<isize, isize> { | |
| return Ok(3); | |
| } | |
| } | |
| impl A for isize {} | |
| fn main() { | |
| assert_eq!(foo(), Err(32)); | |
| assert_eq!(baz(), Err(32)); | |
| assert_eq!(aa(), 3); | |
| assert_eq!(bb(), 3); | |
| assert_eq!(cc().unwrap(), 3); | |
| assert_eq!(dd().unwrap(), 3); | |
| let i = Box::new(32isize) as Box<dyn A>; | |
| assert_eq!(i.aaa(), 3); | |
| let i = Box::new(32isize) as Box<dyn A>; | |
| assert_eq!(i.bbb(), 3); | |
| let i = Box::new(32isize) as Box<dyn A>; | |
| assert_eq!(i.ccc().unwrap(), 3); | |
| let i = Box::new(32isize) as Box<dyn A>; | |
| assert_eq!(i.ddd().unwrap(), 3); | |
| } |