about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJack Huey <jack.huey@umassmed.edu>2021-04-28 10:18:52 -0400
committerJack Huey <jack.huey@umassmed.edu>2021-04-28 10:18:52 -0400
commit31ae3b2bdb9376b749fc1d64b531e86806e03c73 (patch)
tree167b4e70edad00d0c4696c4a90232290e3bc34e5
parent1919b3f22706fee0b2c6ac3d42316545900b7734 (diff)
downloadrust-31ae3b2bdb9376b749fc1d64b531e86806e03c73.tar.gz
rust-31ae3b2bdb9376b749fc1d64b531e86806e03c73.zip
Add HAS_RE_LATE_BOUND if there are bound vars
-rw-r--r--compiler/rustc_middle/src/ty/flags.rs4
-rw-r--r--src/test/ui/lifetimes/issue-83737-erasing-bound-vars.rs14
-rw-r--r--src/test/ui/lifetimes/issue-84604.rs9
3 files changed, 27 insertions, 0 deletions
diff --git a/compiler/rustc_middle/src/ty/flags.rs b/compiler/rustc_middle/src/ty/flags.rs
index 01bc5cc761c..92288c89827 100644
--- a/compiler/rustc_middle/src/ty/flags.rs
+++ b/compiler/rustc_middle/src/ty/flags.rs
@@ -59,6 +59,10 @@ impl FlagComputation {
     {
         let mut computation = FlagComputation::new();
 
+        if !value.bound_vars().is_empty() {
+            computation.flags = computation.flags | TypeFlags::HAS_RE_LATE_BOUND;
+        }
+
         f(&mut computation, value.skip_binder());
 
         self.add_flags(computation.flags);
diff --git a/src/test/ui/lifetimes/issue-83737-erasing-bound-vars.rs b/src/test/ui/lifetimes/issue-83737-erasing-bound-vars.rs
new file mode 100644
index 00000000000..c496a3556c8
--- /dev/null
+++ b/src/test/ui/lifetimes/issue-83737-erasing-bound-vars.rs
@@ -0,0 +1,14 @@
+// build-pass
+// compile-flags: --edition 2018
+// compile-flags: --crate-type rlib
+
+use std::future::Future;
+
+async fn handle<F>(slf: &F)
+where
+    F: Fn(&()) -> Box<dyn for<'a> Future<Output = ()> + Unpin>,
+{
+    (slf)(&()).await;
+}
+
+fn main() {}
diff --git a/src/test/ui/lifetimes/issue-84604.rs b/src/test/ui/lifetimes/issue-84604.rs
new file mode 100644
index 00000000000..df8368da0a0
--- /dev/null
+++ b/src/test/ui/lifetimes/issue-84604.rs
@@ -0,0 +1,9 @@
+// run-pass
+// compile-flags: -Zsymbol-mangling-version=v0
+
+pub fn f<T: ?Sized>() {}
+pub trait Frob<T: ?Sized> {}
+fn main() {
+    f::<dyn Frob<str>>();
+    f::<dyn for<'a> Frob<str>>();
+}