From e8910440a24ecb2ddb08b4dbe170488ddf61fc87 Mon Sep 17 00:00:00 2001 From: liudingming Date: Mon, 9 Aug 2021 20:25:57 +0800 Subject: select obligations after `check_casts` Otherwise, we can get into a situation where you have a subtype obligation `#1 <: #2` pending, #1 is constrained by `check_casts`, but #2` is unaffected. Co-authored-by: Niko Matsakis --- src/test/ui/closures/2229_closure_analysis/issue_88118.rs | 14 ++++++++++++++ src/test/ui/closures/issue-87814-1.rs | 8 ++++++++ src/test/ui/closures/issue-87814-2.rs | 11 +++++++++++ 3 files changed, 33 insertions(+) create mode 100644 src/test/ui/closures/2229_closure_analysis/issue_88118.rs create mode 100644 src/test/ui/closures/issue-87814-1.rs create mode 100644 src/test/ui/closures/issue-87814-2.rs (limited to 'src') diff --git a/src/test/ui/closures/2229_closure_analysis/issue_88118.rs b/src/test/ui/closures/2229_closure_analysis/issue_88118.rs new file mode 100644 index 00000000000..15c6ae4906c --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/issue_88118.rs @@ -0,0 +1,14 @@ +// Regression test for #88118. Used to ICE. +// +// check-pass + +#![feature(capture_disjoint_fields)] + +fn foo(handler: impl FnOnce() -> MsU + Clone + 'static) { + Box::new(move |value| { + (|_| handler.clone()())(value); + None + }) as Box Option>; +} + +fn main() {} \ No newline at end of file diff --git a/src/test/ui/closures/issue-87814-1.rs b/src/test/ui/closures/issue-87814-1.rs new file mode 100644 index 00000000000..5cf01ddf5d7 --- /dev/null +++ b/src/test/ui/closures/issue-87814-1.rs @@ -0,0 +1,8 @@ +// check-pass +fn main() { + let mut schema_all = vec![]; + (0..42).for_each(|_x| match Err(()) as Result<(), _> { + Ok(()) => schema_all.push(()), + Err(_) => (), + }); +} diff --git a/src/test/ui/closures/issue-87814-2.rs b/src/test/ui/closures/issue-87814-2.rs new file mode 100644 index 00000000000..7a5facdac58 --- /dev/null +++ b/src/test/ui/closures/issue-87814-2.rs @@ -0,0 +1,11 @@ +// check-pass +#![feature(try_reserve)] + +fn main() { + let mut schema_all: (Vec, Vec) = (vec![], vec![]); + + let _c = || match schema_all.0.try_reserve(1) as Result<(), _> { + Ok(()) => (), + Err(_) => (), + }; +} -- cgit 1.4.1-3-g733a5