summaryrefslogtreecommitdiffstats
path: root/src/test/ui/impl-trait/issues/issue-104815.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/impl-trait/issues/issue-104815.rs')
-rw-r--r--src/test/ui/impl-trait/issues/issue-104815.rs66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/test/ui/impl-trait/issues/issue-104815.rs b/src/test/ui/impl-trait/issues/issue-104815.rs
new file mode 100644
index 000000000..7a9826a8d
--- /dev/null
+++ b/src/test/ui/impl-trait/issues/issue-104815.rs
@@ -0,0 +1,66 @@
+// check-pass
+
+struct It;
+
+struct Data {
+ items: Vec<It>,
+}
+
+impl Data {
+ fn new() -> Self {
+ Self {
+ items: vec![It, It],
+ }
+ }
+
+ fn content(&self) -> impl Iterator<Item = &It> {
+ self.items.iter()
+ }
+}
+
+struct Container<'a> {
+ name: String,
+ resolver: Box<dyn Resolver + 'a>,
+}
+
+impl<'a> Container<'a> {
+ fn new<R: Resolver + 'a>(name: &str, resolver: R) -> Self {
+ Self {
+ name: name.to_owned(),
+ resolver: Box::new(resolver),
+ }
+ }
+}
+
+trait Resolver {}
+
+impl<R: Resolver> Resolver for &R {}
+
+impl Resolver for It {}
+
+fn get<'a>(mut items: impl Iterator<Item = &'a It>) -> impl Resolver + 'a {
+ items.next().unwrap()
+}
+
+fn get2<'a, 'b: 'b>(mut items: impl Iterator<Item = &'a It>) -> impl Resolver + 'a {
+ items.next().unwrap()
+}
+
+fn main() {
+ let data = Data::new();
+ let resolver = get(data.content());
+
+ let _ = ["a", "b"]
+ .iter()
+ .map(|&n| Container::new(n, &resolver))
+ .map(|c| c.name)
+ .collect::<Vec<_>>();
+
+ let resolver = get2(data.content());
+
+ let _ = ["a", "b"]
+ .iter()
+ .map(|&n| Container::new(n, &resolver))
+ .map(|c| c.name)
+ .collect::<Vec<_>>();
+}