diff --git a/rules/any/tgt_refcount.rs b/rules/any/tgt_refcount.rs index 8bad9f113c..ce69df1430 100644 --- a/rules/any/tgt_refcount.rs +++ b/rules/any/tgt_refcount.rs @@ -29,10 +29,14 @@ fn f14(a0: &mut Option>, init: cpp_type!("std } fn f19(a0: Ptr>>) -> Ptr { - a0.with(|__a: &Option>| match __a.clone().map(|__r| __r.downcast::>()) { - Some(Ok(__v)) => __v.as_pointer(), - _ => Ptr::null(), - }) + if a0.is_null() { + Ptr::null() + } else { + a0.with(|__a: &Option>| match __a.clone().map(|__r| __r.downcast::>()) { + Some(Ok(__v)) => __v.as_pointer(), + _ => Ptr::null(), + }) + } } fn f27(init: cpp_type!("std::decay_t", T1)) -> Option> { diff --git a/rules/any/tgt_unsafe.rs b/rules/any/tgt_unsafe.rs index dfdd9f82b1..a171f3c0fa 100644 --- a/rules/any/tgt_unsafe.rs +++ b/rules/any/tgt_unsafe.rs @@ -25,7 +25,7 @@ unsafe fn f14(a0: &mut Option>, init: cpp_ty } unsafe fn f19(a0: *mut Option>) -> *mut T1 { - match (*a0).as_mut().and_then(|__b| __b.downcast_mut::()) { + match a0.as_mut().and_then(|__a| __a.as_mut()).and_then(|__b| __b.downcast_mut::()) { Some(__v) => __v as *mut T1, None => std::ptr::null_mut(), } diff --git a/tests/unit/any.cpp b/tests/unit/any.cpp index 856fdfe7e8..35821d7ad9 100644 --- a/tests/unit/any.cpp +++ b/tests/unit/any.cpp @@ -24,5 +24,7 @@ int main() { b.reset(); assert(!b.has_value()); assert(std::any_cast(&b) == nullptr); + std::any *n = nullptr; + assert(std::any_cast(n) == nullptr); return 0; } diff --git a/tests/unit/out/refcount/any.rs b/tests/unit/out/refcount/any.rs index ef9bf551c0..f3b972340f 100644 --- a/tests/unit/out/refcount/any.rs +++ b/tests/unit/out/refcount/any.rs @@ -28,23 +28,38 @@ fn main_0() -> i32 { RefCell::new(Point::new({ 3 }, { 4 })), )))); assert!(({ (*a.borrow()).is_some() })); - let mut p: Ptr = (a.as_pointer()).with(|__a: &Option>| match __a - .clone() - .map(|__r| __r.downcast::>()) - { - Some(Ok(__v)) => __v.as_pointer(), - _ => Ptr::null(), - }); + let mut p: Ptr = match ({ (a.as_pointer()) },) { + (mut __tmp_0,) => { + if __tmp_0.is_null() { + Ptr::null() + } else { + __tmp_0.with(|__a: &Option>| { + match __a.clone().map(|__r| __r.downcast::>()) { + Some(Ok(__v)) => __v.as_pointer(), + _ => Ptr::null(), + } + }) + } + } + }; assert!(!((p).is_null())); assert!((p.with(|__s| __s.x) == 3)); assert!((p.with(|__s| __s.y) == 4)); assert!( - ((a.as_pointer()).with(|__a: &Option>| { - match __a.clone().map(|__r| __r.downcast::>()) { - Some(Ok(__v)) => __v.as_pointer(), - _ => Ptr::null(), + (match ({ (a.as_pointer()) },) { + (mut __tmp_1,) => { + if __tmp_1.is_null() { + Ptr::null() + } else { + __tmp_1.with(|__a: &Option>| { + match __a.clone().map(|__r| __r.downcast::>()) { + Some(Ok(__v)) => __v.as_pointer(), + _ => Ptr::null(), + } + }) + } } - })) + }) .is_null() ); let q: Ptr = { @@ -55,38 +70,74 @@ fn main_0() -> i32 { }; assert!((q.with(|__s| __s.x) == 5)); assert!( - ((a.as_pointer()) - .with(|__a: &Option>| { - match __a.clone().map(|__r| __r.downcast::>()) { - Some(Ok(__v)) => __v.as_pointer(), - _ => Ptr::null(), + (match ({ (a.as_pointer()) },) { + (mut __tmp_2,) => { + if __tmp_2.is_null() { + Ptr::null() + } else { + __tmp_2.with(|__a: &Option>| { + match __a.clone().map(|__r| __r.downcast::>()) { + Some(Ok(__v)) => __v.as_pointer(), + _ => Ptr::null(), + } + }) } - }) - .with(|__s| __s.y) + } + } + .with(|__s| __s.y) == 6) ); let b: Value>> = Rc::new(RefCell::new(Some(Rc::new(RefCell::new(7))))); assert!( - (((b.as_pointer()) - .with(|__a: &Option>| { - match __a.clone().map(|__r| __r.downcast::>()) { - Some(Ok(__v)) => __v.as_pointer(), - _ => Ptr::null(), + ((match ({ (b.as_pointer()) },) { + (mut __tmp_3,) => { + if __tmp_3.is_null() { + Ptr::null() + } else { + __tmp_3.with(|__a: &Option>| { + match __a.clone().map(|__r| __r.downcast::>()) { + Some(Ok(__v)) => __v.as_pointer(), + _ => Ptr::null(), + } + }) } - }) - .read()) + } + } + .read()) == 7) ); (*b.borrow_mut()) = None; assert!(({ !((*b.borrow()).is_some()) })); assert!( - ((b.as_pointer()).with(|__a: &Option>| { - match __a.clone().map(|__r| __r.downcast::>()) { - Some(Ok(__v)) => __v.as_pointer(), - _ => Ptr::null(), + (match ({ (b.as_pointer()) },) { + (mut __tmp_4,) => { + if __tmp_4.is_null() { + Ptr::null() + } else { + __tmp_4.with(|__a: &Option>| { + match __a.clone().map(|__r| __r.downcast::>()) { + Some(Ok(__v)) => __v.as_pointer(), + _ => Ptr::null(), + } + }) + } } - })) + }) + .is_null() + ); + let mut n: Ptr>> = Ptr::>>::null(); + assert!( + (if n.is_null() { + Ptr::null() + } else { + n.with(|__a: &Option>| { + match __a.clone().map(|__r| __r.downcast::>()) { + Some(Ok(__v)) => __v.as_pointer(), + _ => Ptr::null(), + } + }) + }) .is_null() ); return 0; diff --git a/tests/unit/out/unsafe/any.rs b/tests/unit/out/unsafe/any.rs index abdb000c81..5cdcce9156 100644 --- a/tests/unit/out/unsafe/any.rs +++ b/tests/unit/out/unsafe/any.rs @@ -27,8 +27,9 @@ pub fn main() { unsafe fn main_0() -> i32 { let mut a: Option> = Some(Box::new(Point::new({ 3 }, { 4 }))); assert!(a.is_some()); - let mut p: *mut Point = match (*(&mut a as *mut Option>)) + let mut p: *mut Point = match (&mut a as *mut Option>) .as_mut() + .and_then(|__a| __a.as_mut()) .and_then(|__b| __b.downcast_mut::()) { Some(__v) => __v as *mut Point, @@ -38,8 +39,9 @@ unsafe fn main_0() -> i32 { assert!((((*p).x) == (3))); assert!((((*p).y) == (4))); assert!( - (match (*(&mut a as *mut Option>)) + (match (&mut a as *mut Option>) .as_mut() + .and_then(|__a| __a.as_mut()) .and_then(|__b| __b.downcast_mut::()) { Some(__v) => __v as *mut i32, @@ -53,8 +55,9 @@ unsafe fn main_0() -> i32 { }; assert!((((*q).x) == (5))); assert!( - (((*match (*(&mut a as *mut Option>)) + (((*match (&mut a as *mut Option>) .as_mut() + .and_then(|__a| __a.as_mut()) .and_then(|__b| __b.downcast_mut::()) { Some(__v) => __v as *mut Point, @@ -64,8 +67,9 @@ unsafe fn main_0() -> i32 { ); let mut b: Option> = Some(Box::new(7)); assert!( - ((*match (*(&mut b as *mut Option>)) + ((*match (&mut b as *mut Option>) .as_mut() + .and_then(|__a| __a.as_mut()) .and_then(|__b| __b.downcast_mut::()) { Some(__v) => __v as *mut i32, @@ -75,8 +79,21 @@ unsafe fn main_0() -> i32 { b = None; assert!(!(b.is_some())); assert!( - (match (*(&mut b as *mut Option>)) + (match (&mut b as *mut Option>) .as_mut() + .and_then(|__a| __a.as_mut()) + .and_then(|__b| __b.downcast_mut::()) + { + Some(__v) => __v as *mut i32, + None => std::ptr::null_mut(), + }) + .is_null() + ); + let mut n: *mut Option> = std::ptr::null_mut(); + assert!( + (match n + .as_mut() + .and_then(|__a| __a.as_mut()) .and_then(|__b| __b.downcast_mut::()) { Some(__v) => __v as *mut i32,