summaryrefslogtreecommitdiffstats
path: root/tests/ui/generic-associated-types
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/generic-associated-types')
-rw-r--r--tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.rs29
-rw-r--r--tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.stderr11
-rw-r--r--tests/ui/generic-associated-types/issue-88287.stderr2
-rw-r--r--tests/ui/generic-associated-types/issue-88595.rs1
-rw-r--r--tests/ui/generic-associated-types/issue-88595.stderr26
-rw-r--r--tests/ui/generic-associated-types/issue-90014-tait.rs23
-rw-r--r--tests/ui/generic-associated-types/issue-90014-tait.stderr22
-rw-r--r--tests/ui/generic-associated-types/issue-90014-tait2.rs46
-rw-r--r--tests/ui/generic-associated-types/issue-90014-tait2.stderr12
9 files changed, 147 insertions, 25 deletions
diff --git a/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.rs b/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.rs
new file mode 100644
index 000000000..05d205266
--- /dev/null
+++ b/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.rs
@@ -0,0 +1,29 @@
+// This test checks that we correctly reject the following unsound code.
+
+trait Lengthen<T> {
+ fn lengthen(self) -> T;
+}
+
+impl<'a> Lengthen<&'a str> for &'a str {
+ fn lengthen(self) -> &'a str { self }
+}
+
+trait Gat {
+ type Gat<'a>: for<'b> Lengthen<Self::Gat<'b>>;
+
+ fn lengthen(s: Self::Gat<'_>) -> Self::Gat<'static> {
+ s.lengthen()
+ }
+}
+
+impl Gat for () {
+ type Gat<'a> = &'a str; //~ ERROR: implementation of `Lengthen` is not general enough
+}
+
+fn main() {
+ let s = "hello, garbage".to_string();
+ let borrow: &'static str = <() as Gat>::lengthen(&s);
+ drop(s);
+
+ println!("{borrow}");
+}
diff --git a/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.stderr b/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.stderr
new file mode 100644
index 000000000..7ea7a7b2d
--- /dev/null
+++ b/tests/ui/generic-associated-types/gat-bounds-not-checked-with-right-substitutions.stderr
@@ -0,0 +1,11 @@
+error: implementation of `Lengthen` is not general enough
+ --> $DIR/gat-bounds-not-checked-with-right-substitutions.rs:20:20
+ |
+LL | type Gat<'a> = &'a str;
+ | ^^^^^^^ implementation of `Lengthen` is not general enough
+ |
+ = note: `Lengthen<&'0 str>` would have to be implemented for the type `&'a str`, for any lifetime `'0`...
+ = note: ...but `Lengthen<&'1 str>` is actually implemented for the type `&'1 str`, for some specific lifetime `'1`
+
+error: aborting due to previous error
+
diff --git a/tests/ui/generic-associated-types/issue-88287.stderr b/tests/ui/generic-associated-types/issue-88287.stderr
index 1b84cce62..d77076a28 100644
--- a/tests/ui/generic-associated-types/issue-88287.stderr
+++ b/tests/ui/generic-associated-types/issue-88287.stderr
@@ -2,7 +2,7 @@ error[E0277]: the size for values of type `A` cannot be known at compilation tim
--> $DIR/issue-88287.rs:34:9
|
LL | type SearchFutureTy<'f, A, B: 'f>
- | - this type parameter needs to be `std::marker::Sized`
+ | - this type parameter needs to be `Sized`
...
LL | async move { todo!() }
| ^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
diff --git a/tests/ui/generic-associated-types/issue-88595.rs b/tests/ui/generic-associated-types/issue-88595.rs
index 7de906e7e..5a40a6129 100644
--- a/tests/ui/generic-associated-types/issue-88595.rs
+++ b/tests/ui/generic-associated-types/issue-88595.rs
@@ -19,5 +19,4 @@ impl<'a> A<'a> for C {
type B<'b> = impl Clone;
fn a(&'a self) -> Self::B<'a> {} //~ ERROR: non-defining opaque type use in defining scope
- //~^ ERROR: mismatched types
}
diff --git a/tests/ui/generic-associated-types/issue-88595.stderr b/tests/ui/generic-associated-types/issue-88595.stderr
index d6caed854..2b1a25acf 100644
--- a/tests/ui/generic-associated-types/issue-88595.stderr
+++ b/tests/ui/generic-associated-types/issue-88595.stderr
@@ -1,8 +1,8 @@
error: non-defining opaque type use in defining scope
- --> $DIR/issue-88595.rs:21:5
+ --> $DIR/issue-88595.rs:21:23
|
LL | fn a(&'a self) -> Self::B<'a> {}
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ generic argument `'a` used twice
+ | ^^^^^^^^^^^ generic argument `'a` used twice
|
note: for this opaque type
--> $DIR/issue-88595.rs:19:18
@@ -10,25 +10,5 @@ note: for this opaque type
LL | type B<'b> = impl Clone;
| ^^^^^^^^^^
-error[E0308]: mismatched types
- --> $DIR/issue-88595.rs:21:23
- |
-LL | type B<'b> = impl Clone;
- | ---------- the expected opaque type
-LL |
-LL | fn a(&'a self) -> Self::B<'a> {}
- | - ^^^^^^^^^^^ expected opaque type, found `()`
- | |
- | implicitly returns `()` as its body has no tail or `return` expression
- |
- = note: expected opaque type `<C as A<'a>>::B<'a>`
- found unit type `()`
-note: this item must have the opaque type in its signature in order to be able to register hidden types
- --> $DIR/issue-88595.rs:21:5
- |
-LL | fn a(&'a self) -> Self::B<'a> {}
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-error: aborting due to 2 previous errors
+error: aborting due to previous error
-For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/generic-associated-types/issue-90014-tait.rs b/tests/ui/generic-associated-types/issue-90014-tait.rs
new file mode 100644
index 000000000..bc3a4e129
--- /dev/null
+++ b/tests/ui/generic-associated-types/issue-90014-tait.rs
@@ -0,0 +1,23 @@
+//! This test is reporting the wrong error. We need
+//! more inherent associated type tests that use opaque types
+//! in general. Some variant of this test should compile successfully.
+// known-bug: unknown
+// edition:2018
+
+#![feature(impl_trait_in_assoc_type, inherent_associated_types)]
+#![allow(incomplete_features)]
+
+use std::future::Future;
+
+struct Foo<'a>(&'a mut ());
+
+impl Foo<'_> {
+ type Fut<'a> = impl Future<Output = ()>;
+ //^ ERROR: the type `&mut ()` does not fulfill the required lifetime
+
+ fn make_fut<'a>(&'a self) -> Self::Fut<'a> {
+ async { () }
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/generic-associated-types/issue-90014-tait.stderr b/tests/ui/generic-associated-types/issue-90014-tait.stderr
new file mode 100644
index 000000000..8330a387e
--- /dev/null
+++ b/tests/ui/generic-associated-types/issue-90014-tait.stderr
@@ -0,0 +1,22 @@
+error[E0308]: mismatched types
+ --> $DIR/issue-90014-tait.rs:19:9
+ |
+LL | type Fut<'a> = impl Future<Output = ()>;
+ | ------------------------ the expected future
+...
+LL | fn make_fut<'a>(&'a self) -> Self::Fut<'a> {
+ | ------------- expected `Foo<'_>::Fut<'a>` because of return type
+LL | async { () }
+ | ^^^^^^^^^^^^ expected future, found `async` block
+ |
+ = note: expected opaque type `Foo<'_>::Fut<'a>`
+ found `async` block `[async block@$DIR/issue-90014-tait.rs:19:9: 19:21]`
+note: this item must have the opaque type in its signature in order to be able to register hidden types
+ --> $DIR/issue-90014-tait.rs:18:8
+ |
+LL | fn make_fut<'a>(&'a self) -> Self::Fut<'a> {
+ | ^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/generic-associated-types/issue-90014-tait2.rs b/tests/ui/generic-associated-types/issue-90014-tait2.rs
new file mode 100644
index 000000000..dacbc93de
--- /dev/null
+++ b/tests/ui/generic-associated-types/issue-90014-tait2.rs
@@ -0,0 +1,46 @@
+//! This test checks that opaque type collection doesn't try to normalize the projection
+//! without respecting its binders (which would ICE).
+//! Unfortunately we don't even reach opaque type collection, as we ICE in typeck before that.
+// known-bug: #109281
+// failure-status: 101
+// error-pattern:internal compiler error
+// normalize-stderr-test "internal compiler error.*" -> ""
+// normalize-stderr-test "DefId\([^)]*\)" -> "..."
+// normalize-stderr-test "\nerror: internal compiler error.*\n\n" -> ""
+// normalize-stderr-test "note:.*unexpectedly panicked.*\n\n" -> ""
+// normalize-stderr-test "note: we would appreciate a bug report.*\n\n" -> ""
+// normalize-stderr-test "note: compiler flags.*\n\n" -> ""
+// normalize-stderr-test "note: rustc.*running on.*\n\n" -> ""
+// normalize-stderr-test "thread.*panicked.*\n" -> ""
+// normalize-stderr-test "stack backtrace:\n" -> ""
+// normalize-stderr-test "\s\d{1,}: .*\n" -> ""
+// normalize-stderr-test "\s at .*\n" -> ""
+// normalize-stderr-test ".*note: Some details.*\n" -> ""
+// normalize-stderr-test "\n\n[ ]*\n" -> ""
+// normalize-stderr-test "compiler/.*: projection" -> "projection"
+// edition:2018
+
+#![feature(type_alias_impl_trait)]
+#![allow(incomplete_features)]
+
+use std::future::Future;
+
+struct Foo<'a>(&'a mut ());
+
+type Fut<'a> = impl Future<Output = ()>;
+
+trait Trait<'x> {
+ type Thing;
+}
+
+impl<'x, T: 'x> Trait<'x> for (T,) {
+ type Thing = T;
+}
+
+impl Foo<'_> {
+ fn make_fut(&self) -> Box<dyn for<'a> Trait<'a, Thing = Fut<'a>>> {
+ Box::new((async { () },))
+ }
+}
+
+fn main() {}
diff --git a/tests/ui/generic-associated-types/issue-90014-tait2.stderr b/tests/ui/generic-associated-types/issue-90014-tait2.stderr
new file mode 100644
index 000000000..3187be333
--- /dev/null
+++ b/tests/ui/generic-associated-types/issue-90014-tait2.stderr
@@ -0,0 +1,12 @@
+error:
+ --> $DIR/issue-90014-tait2.rs:41:27
+ |
+LL | fn make_fut(&self) -> Box<dyn for<'a> Trait<'a, Thing = Fut<'a>>> {
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^query stack during panic:
+#0 [typeck] type-checking `<impl at $DIR/issue-90014-tait2.rs:40:1: 40:13>::make_fut`
+#1 [type_of] computing type of `Fut::{opaque#0}`
+#2 [check_mod_item_types] checking item types in top-level module
+#3 [analysis] running analysis passes on this crate
+end of query stack
+error: aborting due to previous error
+