about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/ui/lazy-type-alias/auxiliary/eager.rs6
-rw-r--r--tests/ui/lazy-type-alias/auxiliary/lazy.rs4
-rw-r--r--tests/ui/lazy-type-alias/extern-crate-has-eager-type-aliases.rs23
-rw-r--r--tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.locally_eager.stderr15
-rw-r--r--tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.locally_lazy.stderr15
-rw-r--r--tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.rs16
6 files changed, 79 insertions, 0 deletions
diff --git a/tests/ui/lazy-type-alias/auxiliary/eager.rs b/tests/ui/lazy-type-alias/auxiliary/eager.rs
new file mode 100644
index 00000000000..8793a1701ec
--- /dev/null
+++ b/tests/ui/lazy-type-alias/auxiliary/eager.rs
@@ -0,0 +1,6 @@
+// This crate does *not* have lazy type aliases enabled.
+
+#![allow(type_alias_bounds)]
+
+// The `Copy` bound is ignored both locally and externally for backward compatibility.
+pub type Alias<T: Copy> = Option<T>;
diff --git a/tests/ui/lazy-type-alias/auxiliary/lazy.rs b/tests/ui/lazy-type-alias/auxiliary/lazy.rs
new file mode 100644
index 00000000000..caa7999b4f7
--- /dev/null
+++ b/tests/ui/lazy-type-alias/auxiliary/lazy.rs
@@ -0,0 +1,4 @@
+#![feature(lazy_type_alias)]
+#![allow(incomplete_features)]
+
+pub type Alias<T: Copy> = Option<T>;
diff --git a/tests/ui/lazy-type-alias/extern-crate-has-eager-type-aliases.rs b/tests/ui/lazy-type-alias/extern-crate-has-eager-type-aliases.rs
new file mode 100644
index 00000000000..07389961c4c
--- /dev/null
+++ b/tests/ui/lazy-type-alias/extern-crate-has-eager-type-aliases.rs
@@ -0,0 +1,23 @@
+// This test serves as a regression test for issue #114468 and it also ensures that we consider
+// type aliases from external crates that don't have `lazy_type_alias` enabled to be eager.
+
+// aux-crate:eager=eager.rs
+// edition: 2021
+// check-pass
+
+#![feature(lazy_type_alias)]
+#![allow(incomplete_features)]
+
+// This used to crash when we were computing the variances of `Struct` since we would convert
+// `eager::Alias<T>` to a weak projection due to the presence of `#![feature(lazy_type_alias)]` in
+// this (!) crate and subsequently attempt to obtain the variances of the type alias associated with
+// the weak projection which would panic because we don't compute this information for eager type
+// aliases at all.
+struct Struct<T>(eager::Alias<T>);
+
+fn main() {
+    // We want to ignore (or rather “end up ignoring”) the bound `T: Copy` since `Alias` should be
+    // treated as an eager type alias not just inside the crate it is defined in but also in
+    // dependent crates (like this one).
+    let _: eager::Alias<String>;
+}
diff --git a/tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.locally_eager.stderr b/tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.locally_eager.stderr
new file mode 100644
index 00000000000..9e0e2bfa872
--- /dev/null
+++ b/tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.locally_eager.stderr
@@ -0,0 +1,15 @@
+error[E0277]: the trait bound `String: Copy` is not satisfied
+  --> $DIR/extern-crate-has-lazy-type-aliases.rs:15:12
+   |
+LL |     let _: lazy::Alias<String>;
+   |            ^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `String`
+   |
+note: required by a bound on the type alias `Alias`
+  --> $DIR/auxiliary/lazy.rs:4:19
+   |
+LL | pub type Alias<T: Copy> = Option<T>;
+   |                   ^^^^ required by this bound
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.locally_lazy.stderr b/tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.locally_lazy.stderr
new file mode 100644
index 00000000000..9e0e2bfa872
--- /dev/null
+++ b/tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.locally_lazy.stderr
@@ -0,0 +1,15 @@
+error[E0277]: the trait bound `String: Copy` is not satisfied
+  --> $DIR/extern-crate-has-lazy-type-aliases.rs:15:12
+   |
+LL |     let _: lazy::Alias<String>;
+   |            ^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `String`
+   |
+note: required by a bound on the type alias `Alias`
+  --> $DIR/auxiliary/lazy.rs:4:19
+   |
+LL | pub type Alias<T: Copy> = Option<T>;
+   |                   ^^^^ required by this bound
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.rs b/tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.rs
new file mode 100644
index 00000000000..31a19161b6c
--- /dev/null
+++ b/tests/ui/lazy-type-alias/extern-crate-has-lazy-type-aliases.rs
@@ -0,0 +1,16 @@
+// revisions: locally_eager locally_lazy
+// aux-crate:lazy=lazy.rs
+// edition: 2021
+
+// Test that we treat lazy type aliases from external crates as lazy independently of whether the
+// local crate enables `lazy_type_alias` or not.
+
+#![cfg_attr(
+    locally_lazy,
+    feature(lazy_type_alias),
+    allow(incomplete_features)
+)]
+
+fn main() {
+    let _: lazy::Alias<String>; //~ ERROR the trait bound `String: Copy` is not satisfied
+}