summaryrefslogtreecommitdiffstats
path: root/tests/ui/implied-bounds
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/implied-bounds')
-rw-r--r--tests/ui/implied-bounds/implied-bounds-entailment-wf-vars-issue-114783-1.rs26
-rw-r--r--tests/ui/implied-bounds/implied-bounds-entailment-wf-vars-issue-114783-2.rs26
-rw-r--r--tests/ui/implied-bounds/implied_bounds_entailment_alias_var.rs32
-rw-r--r--tests/ui/implied-bounds/implied_bounds_entailment_skip_non_outlives.rs23
-rw-r--r--tests/ui/implied-bounds/trait-where-clause-implied.rs15
5 files changed, 122 insertions, 0 deletions
diff --git a/tests/ui/implied-bounds/implied-bounds-entailment-wf-vars-issue-114783-1.rs b/tests/ui/implied-bounds/implied-bounds-entailment-wf-vars-issue-114783-1.rs
new file mode 100644
index 000000000..9b793642d
--- /dev/null
+++ b/tests/ui/implied-bounds/implied-bounds-entailment-wf-vars-issue-114783-1.rs
@@ -0,0 +1,26 @@
+// check-pass
+
+pub trait Foo {
+ type Error: Error;
+
+ fn foo(&self, stream: &<Self::Error as Error>::Span);
+}
+
+pub struct Wrapper<Inner>(Inner);
+
+impl<E: Error, Inner> Foo for Wrapper<Inner>
+where
+ Inner: Foo<Error = E>,
+{
+ type Error = E;
+
+ fn foo(&self, stream: &<Self::Error as Error>::Span) {
+ todo!()
+ }
+}
+
+pub trait Error {
+ type Span;
+}
+
+fn main() {}
diff --git a/tests/ui/implied-bounds/implied-bounds-entailment-wf-vars-issue-114783-2.rs b/tests/ui/implied-bounds/implied-bounds-entailment-wf-vars-issue-114783-2.rs
new file mode 100644
index 000000000..86b10a56c
--- /dev/null
+++ b/tests/ui/implied-bounds/implied-bounds-entailment-wf-vars-issue-114783-2.rs
@@ -0,0 +1,26 @@
+// check-pass
+
+trait AsBufferView {
+ type Device;
+}
+
+trait Error {
+ type Span;
+}
+
+trait Foo {
+ type Error: Error;
+ fn foo(&self) -> &<Self::Error as Error>::Span;
+}
+
+impl<D: Error, VBuf0> Foo for VBuf0
+where
+ VBuf0: AsBufferView<Device = D>,
+{
+ type Error = D;
+ fn foo(&self) -> &<Self::Error as Error>::Span {
+ todo!()
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/implied-bounds/implied_bounds_entailment_alias_var.rs b/tests/ui/implied-bounds/implied_bounds_entailment_alias_var.rs
new file mode 100644
index 000000000..e0df96b0d
--- /dev/null
+++ b/tests/ui/implied-bounds/implied_bounds_entailment_alias_var.rs
@@ -0,0 +1,32 @@
+// check-pass
+
+trait Data {
+ type Elem;
+}
+
+impl<F, S: Data<Elem = F>> Data for ArrayBase<S> {
+ type Elem = F;
+}
+
+struct DatasetIter<'a, R: Data> {
+ data: &'a R::Elem,
+}
+
+pub struct ArrayBase<S> {
+ data: S,
+}
+
+trait Trait {
+ type Item;
+ fn next() -> Option<Self::Item>;
+}
+
+impl<'a, D: Data> Trait for DatasetIter<'a, ArrayBase<D>> {
+ type Item = ();
+
+ fn next() -> Option<Self::Item> {
+ None
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/implied-bounds/implied_bounds_entailment_skip_non_outlives.rs b/tests/ui/implied-bounds/implied_bounds_entailment_skip_non_outlives.rs
new file mode 100644
index 000000000..8dcc35a28
--- /dev/null
+++ b/tests/ui/implied-bounds/implied_bounds_entailment_skip_non_outlives.rs
@@ -0,0 +1,23 @@
+// check-pass
+// See issue #109356. We don't want a false positive to the `implied_bounds_entailment` lint.
+
+use std::borrow::Cow;
+
+pub trait Trait {
+ fn method(self) -> Option<Cow<'static, str>>
+ where
+ Self: Sized;
+}
+
+impl<'a> Trait for Cow<'a, str> {
+ // If we're not careful here, we'll check `WF(return-type)` using the trait
+ // and impl where clauses, requiring that `Cow<'a, str>: Sized`. This is
+ // obviously true, but if we pick the `Self: Sized` clause from the trait
+ // over the "inherent impl", we will require `'a == 'static`, which triggers
+ // the `implied_bounds_entailment` lint.
+ fn method(self) -> Option<Cow<'static, str>> {
+ None
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/implied-bounds/trait-where-clause-implied.rs b/tests/ui/implied-bounds/trait-where-clause-implied.rs
new file mode 100644
index 000000000..5f9ab66d3
--- /dev/null
+++ b/tests/ui/implied-bounds/trait-where-clause-implied.rs
@@ -0,0 +1,15 @@
+// check-pass
+
+pub trait Trait<'a, 'b> {
+ fn method(self, _: &'static &'static ())
+ where
+ 'a: 'b;
+}
+
+impl<'a> Trait<'a, 'static> for () {
+ // On first glance, this seems like we have the extra implied bound that
+ // `'a: 'static`, but we know this from the trait method where clause.
+ fn method(self, _: &'static &'a ()) {}
+}
+
+fn main() {}